powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / spring MVC Несколько sessionAttributes и ModelAttribute
7 сообщений из 7, страница 1 из 1
spring MVC Несколько sessionAttributes и ModelAttribute
    #39137336
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос как с помощью метода провернуть след. трюк :

при заходе на уникальных url в рамках контроллера нужно создавать ModelAttribute
типизированный под этот url

Есть контроллер :

Код: java
1.
2.
3.
@Controller
@SessionAttributes( types = GainsTicket.class, value = {GAINSTICKET})
public class GainsController {



где GainsTicket - интерфейс , который может иметь трех наследников под каждый их трех уникальных url

Код: java
1.
2.
3.
4.
  
   public static final String GAINS_BARCODE_URL = "/gains/barcode";
   public static final String GAINS_UNIQUEKEY_URL = "/gains/unique_key";
   public static final String GAINS_INSTANT_URL = "/gains/instant";






Как с помощью методов или метода создать следующее поведение :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    @ModelAttribute(GAINSTICKET)
    public GainsTicket gainsTicket(HttpServletRequest request) {
        String path = request.getServletPath();
        System.out.println("add gainsTicket " + path);
        if (GAINS_BARCODE_URL.equals(path)) {
            return GainsTicketFactory.getInstance(BARCODE);
        }
        if (GAINS_UNIQUEKEY_URL.equals(path)) {
            return GainsTicketFactory.getInstance(UNIQUEID);
        }
        
        return null;

    }




чтобы положить в сессию в одно имя разные объекты ...

в зависимости от того на какой url мы зашли ... ?

а если мы зашли на другой url - то перетереть этот атрибут?

или это можно делать только так :
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    //GET 
    @RequestMapping(value = GAINS_BARCODE_URL, method = RequestMethod.GET)
    public ModelAndView barcode(HttpSession httpSession ) {
        httpSession.setAttribute(GAINSTICKET, new BarcodeGainsTicket() );
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName(GAINS_BARCODE);
        return modelAndView;
    }

    @RequestMapping(value = GAINS_UNIQUEKEY_URL, method = RequestMethod.GET)
    public ModelAndView uniqueKey(HttpSession httpSession ) {
        httpSession.setAttribute(GAINSTICKET, new UniqueGainsTicket() );
        ModelAndView model = new ModelAndView();
        model.setViewName(GAINS_UNIQUEKEY);
        return model;
    }
...
Рейтинг: 0 / 0
spring MVC Несколько sessionAttributes и ModelAttribute
    #39137372
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Для чего :

после POST =

делается redirect на jsp с ошибками - где нужно положить в GAINSTICKET текущий атрибут ....

redirectView.addStaticAttribute(GAINSTICKET, gainsTicket);

но почему то это не работает !!!!

и на jsp страницу его нет ...
${gainsTicket} - нету
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
       <div class="main_container">
            <form:form>
             
              
                <h3 style="color:#990000">Произошла ошибка </h3>
                 Описание: <spring:message code="0x${gainsTicket.errorHex}"/>
                    <div class="btn-group-right" role="group">
                    <c:set var="type"  value="${gainsTicket.getType()}"/>
                    <button type="button" value="${GainsController.getRedirectUrl(type)}"  class="btn btn-default btn-sm active back"> 
                     <spring:message code="button.back"/></button>
                </div>
            </form:form>
        </div>



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 @RequestMapping(value = GAINS_BARCODE_URL, method = RequestMethod.POST)
    @Transactional(readOnly = false)
    public RedirectView checkPrize(@Valid BarcodeForm barcodeForm,
            @ModelAttribute(value = BARCODETICKET) BarcodeGainsTicket gainsTicket,
            BindingResult bindingResult) {

        RedirectView redirectView = new RedirectView();
        redirectView.addStaticAttribute(GAINSTICKET, gainsTicket);
      
        if (bindingResult.hasErrors()) {
            redirectView.setUrl(GAINS_ERRORS_URL);
        } else {
      
            final GainsResult result = gainsService.checkPrize(gainsTicket);
            if (GainsOperationStatus.OK.equals(result.getStatus())) {
              redirectView.setUrl(GAINS_BARCODE_URL);
            } else {
                redirectView.setUrl(GAINS_ERRORS_URL);
            }

        }

        return redirectView;
    }
...
Рейтинг: 0 / 0
spring MVC Несколько sessionAttributes и ModelAttribute
    #39137414
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    @ModelAttribute(BARCODETICKET)
    GainsTicket barcodeTicket() {
        return new BarcodeGainsTicket();
   }

    @ModelAttribute(UNIQUETICKET)
   GainsTicket uniqueTicket() {
       return new UniqueGainsTicket();
    }



Хочется иметь именно такое поведение

ибо если будет так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    //GET 
    @RequestMapping(value = GAINS_BARCODE_URL, method = RequestMethod.GET)
    public ModelAndView barcode(HttpSession httpSession ) {
        httpSession.setAttribute(GAINSTICKET, new BarcodeGainsTicket() );
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName(GAINS_BARCODE);
        return modelAndView;
    }

    @RequestMapping(value = GAINS_UNIQUEKEY_URL, method = RequestMethod.GET)
    public ModelAndView uniqueKey(HttpSession httpSession ) {
        httpSession.setAttribute(GAINSTICKET, new UniqueGainsTicket() );
        ModelAndView model = new ModelAndView();
        model.setViewName(GAINS_UNIQUEKEY);
        return model;
    }



то эти атрибуту будут создавать каждый раз при заходе на эту страницу(цы) ...

а мне нужно чтобы и на этих страницах по GET - этот атрибут присутствовал

из него я буду тянуть данные
...
Рейтинг: 0 / 0
spring MVC Несколько sessionAttributes и ModelAttribute
    #39137446
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще проще мой вопрос :

как в контроллере который реализовал POST

и делает redirectView
RedirectView redirectView = new RedirectView();

на страницу jsp ошибок передать текущий для метода POST ModelAttribute и дать ему имя :


GAINSTICKET ? чтобы на странице он был доступен по ${gainsTicket} ?
...
Рейтинг: 0 / 0
spring MVC Несколько sessionAttributes и ModelAttribute
    #39137477
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создал :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
MyServletContextListener implements ServletContextListener,
                                                          HttpSessionListener,
                                                          HttpSessionAttributeListener {

    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        logger.info("attributeReplaced "+ event.getName());
        
        if(event.getValue() instanceof GainsTicket){
            
            logger.info( ((GainsTicket )event.getValue()).getType() );
        }
    }
}




так вот :

когда делаю замену атрибута в логах вижу что атрибут меняется :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    //GET 
    @RequestMapping(value = GAINS_BARCODE_URL, method = RequestMethod.GET)
    public ModelAndView barcode(HttpSession httpSession) {
        
        BarcodeGainsTicket gainsTicket = new BarcodeGainsTicket();
        httpSession.setAttribute(GAINSTICKET, gainsTicket);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName(GAINS_BARCODE);
        return modelAndView;
    }

    @RequestMapping(value = GAINS_UNIQUEKEY_URL, method = RequestMethod.GET)
    public ModelAndView uniqueKey(HttpSession httpSession) {
       UniqueGainsTicket gainsTicket =  new UniqueGainsTicket();
         httpSession.setAttribute(GAINSTICKET,gainsTicket);
         
        ModelAndView model = new ModelAndView();
        model.setViewName(GAINS_UNIQUEKEY);
        return model;
    }



Но при вызове POST ( при попытке отправить запрос )

получаю ошибку
(я зашел на одни урл - положил одно значение ... потом зашел на другой поменял его ... но по факту из описания ошибки - значение не изменилось !!!)
Код: java
1.
org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'UniqueGainsTicket' to required type 'BarcodeGainsTicket'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [UniqueGainsTicket] to required type [BarcodeGainsTicket]: no matching editors or conversion strategy found




это говорит о том что модельный атрибут не изменился !!!

как такое возможно???

они меняются в каком то другом скопе???
...
Рейтинг: 0 / 0
spring MVC Несколько sessionAttributes и ModelAttribute
    #39137484
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такое впечатление что в разные места добавляются ... как будто есть другая сессия и ее скоуп !

добавил в метод get status.setComplete();

org.springframework.web.context.request.ServletRequestAttributes.DESTRUCTION_CALLBACK.gainsTicket
и

attributeAdded gainsTicket

разные имена !!! как такое может быть??

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    //GET 
    @RequestMapping(value = GAINS_BARCODE_URL, method = RequestMethod.GET)
    public ModelAndView barcode(SessionStatus status ,HttpSession httpSession) {
        
        status.setComplete();
        BarcodeGainsTicket gainsTicket = new BarcodeGainsTicket();
        httpSession.setAttribute(GAINSTICKET, gainsTicket);
        
     
        
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName(GAINS_BARCODE);
        return modelAndView;
    }



логах
Код: java
1.
2.
3.
4.
5.
6.
7.
18:12:47,449  INFO qtp1388911091-18 TerminalServletContextListener:attributeAdded:55 - attributeAdded gainsTicket
18:12:47,451  INFO qtp1388911091-18 TerminalServletContextListener:attributeRemoved:61 - attributeRemoved gainsTicket
18:12:47,452  INFO qtp1388911091-18 TerminalServletContextListener:attributeAdded:55 - attributeAdded org.springframework.web.context.request.ServletRequestAttributes.DESTRUCTION_CALLBACK.gainsTicket
18:13:02,333  INFO qtp1388911091-22 TerminalServletContextListener:attributeAdded:55 - attributeAdded gainsTicket
18:13:02,334  INFO qtp1388911091-22 TerminalServletContextListener:attributeRemoved:61 - attributeRemoved gainsTicket
18:13:02,335  INFO qtp1388911091-22 TerminalServletContextListener:attributeAdded:55 - attributeAdded org.springframework.web.context.request.ServletRequestAttributes.DESTRUCTION_CALLBACK.gainsTicket
18:13:15,491 ERROR qtp1388911091-16 ExceptionHandlerController:handelException:43 - org.springframework.web.HttpSessionRequiredException: Expected session attribute 'gainsTicket'
...
Рейтинг: 0 / 0
spring MVC Несколько sessionAttributes и ModelAttribute
    #39137816
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кому интересно

http://stackoverflow.com/questions/27191798/spring-sessionattributes-vs-httpsession/27192130

решение в итоге такое - в POST для страницы ошибок кладу в сессию нужный бин.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / spring MVC Несколько sessionAttributes и ModelAttribute
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]