2012-02-02 9 views
0

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

В контроллер AI имеют аннотированный класс с @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, однако, если я теперь хочу добавить еще один myModel1 myModel1 myModel1 для этой подписи метода, я бы ожидал, что смогу прочитать значение, которое я устанавливал в контроллере A, однако я получаю исключения, что первая модель больше не признается.

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

ответ

1

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

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

Например, я использую эту аннотацию, когда я хочу, чтобы проверить элементы с проверкой Hibernate, и после отправки страницы и некоторые элементы являются недопустимыми я хочу остальное будет по-прежнему на странице, но это не ваш случай , Я думаю, что единственный способ сделать это было бы с:

HttpSession.getAttribute() 
+0

Uhmmm Я бы подумал, что Spring может предоставить что-то более умное для хранения и получения атрибутов сеанса, отличных от старого старого HttpSession. Как насчет того, если я помечаю свой бин модели с помощью @SessionAttributes – Joly

+0

@Joly Я действительно не думаю, что это сработает – Eugene

1

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

+0

Не мог бы представить пример кода, как это может работать? Предположим, я аннотирую MyModel1 с @SessionAttributes. Что мне нужно сделать, чтобы убедиться, что я перечисляю один и тот же экземпляр? Мое понимание того, что для того, чтобы перечислить, мне нужно будет установить его сначала на обоих контроллерах, поэтому в разных экземплярах модели. – Joly