Лучшая практика для использования @SessionAttributes - PullRequest
0 голосов
/ 02 февраля 2012

Я пытаюсь обмениваться данными между двумя контроллерами в приложении Spring mvc.

В контроллере A я аннотировал класс с помощью @SessionAttributes ({"mymodel1"}) и в методе, который получает первый запрос GET, добавляю его в ModelMap:

model.addAttribute("mymodel1", MyModel1);

Теперь я хочу прочитать myModel1 из контроллера B. В этом контроллере у меня есть следующий метод, который перехватывает запросы POST и уже имеет другую модель в своих параметрах:

public String processSubmit(@ModelAttribute("mymodel2") MyModel2 mymodel2, BindingResult result, SessionStatus status, HttpServletRequest httpRequest)

До этого момента все работало нормально, и я могу читать mymodel2 из processSubmit, однако, если теперь я хочу добавить еще одну @ModelAttribute ("mymodel1") MyModel1 mymodel1 к этой сигнатуре метода, я ожидал, что смогу прочитать значение, которое я устанавливал в Контроллере А, однако я получаю исключения, что первая модель больше не распознается.

Итак, мой вопрос: как я могу прочитать mymodel2 из контроллера B?

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Выдержка javadoc, приведенная выше, является наиболее типичным способом использования @SessionAttributes.Однако то, что описывает Джоли, также должно работать.Атрибуты сеанса хранятся через DefaultSessionAttributeStore, который по умолчанию не ставит имена атрибутов в начале, когда сохраняет их в сеансе.Это означает, что если ControllerA и ControllerB оба перечисляют атрибут с именем «mymodel1», они фактически ссылаются на один и тот же атрибут сеанса.Вам нужно будет предоставить немного больше информации об ошибке, которую вы получаете, и фактическом коде контроллера.

1 голос
/ 03 февраля 2012

Вы не можете сделать это с @ SessionAttributes :

Атрибуты сеанса, как указано с помощью этой аннотации, соответствуют атрибутам модели определенных обработчиков, прозрачно сохраняемым в сеансе разговора.,Эти атрибуты будут удалены, как только обработчик укажет на завершение сеанса разговора.Поэтому используйте эту возможность для таких диалоговых атрибутов, которые должны временно храниться в сеансе в ходе разговора с определенными обработчиками.

Например, я использую эту аннотацию, когда хочу проверить элементы с помощьюПроверка гибернации, и после того, как я отправляю страницу, а НЕКОТОРЫЕ элементы недействительны, я хочу, чтобы остальное все еще оставалось на странице, но это не ваш случай.Я думаю, что единственный способ сделать это будет с:

HttpSession.getAttribute()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...