Spring MVC: @SessionAttributes совместно используются контроллерами? - PullRequest
5 голосов
/ 25 октября 2010

У меня есть абстрактный класс поддержки контроллера для поиска и списков результатов:

@Controller
@SessionAttributes("query")
public abstract class SearchController<Q extends SearchQuery> {
    @RequestMapping
    public String performSearch(@ModelAttribute("query") Q query) {
        ....
    }

    @ModelAttribute("query")
    public abstract Q createDefaultSearchQuery();
}

Несколько реальных контроллеров поиска расширяют этот базовый класс.

После обращения к одному из контроллеров (скажем /searchBooks.html с использованием BookSearchQuery implements SearchQuery) запрос правильно сохраняется в сеансе и доступен для последующих запросов.

Однако, когда я обращаюсь к другому контроллеру (скажем, /searchAuthors.html с использованием AuthorSearchQuery implements SearchQuery), запрос из последнего запроса(BookSearchQuery) все еще используется для нового контроллера, что впоследствии вызывает ClassCastException.

Я попытался переместить аннотацию @SessionAttribute из класса поддержки в классы реализации, но безрезультатно.

Есть ли что-то, что я делаю не так или это задумано?Что я могу сделать?

Большое спасибо!

Ответы [ 2 ]

4 голосов
/ 19 июля 2011

Я только что попробовал это на Spring 3.0.2, и атрибуты сеанса не распределяются между контроллерами.На самом деле я искал противоположный эффект, и вот как я узнал.

0 голосов
/ 25 октября 2010

Используя @SessionAttributes, эти объекты будут храниться в вашей HttpSession с тем же именем, и они будут доступны (совместно использованы) с разных контроллеров. Итак, весна действует правильно.

Я думаю, что лучший подход в вашем сценарии - переименовать этот атрибут в каждом подклассе ("BookQuery", "AutorQuery", ...). Не очень элегантно на всех: (

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