I have an abstract controller support class for searches and result lists:
@Controller
@SessionAttributes("query")
public abstract class SearchController<Q extends SearchQuery> {
@RequestMapping
public String performSearch(@ModelAttribute("query") Q query) {
....
}
@ModelAttribute("query")
public abstract Q createDefaultSearchQuery();
}
Several actual search controllers extend this base class.
After having accessed one of the controllers (say /searchBooks.html using BookSearchQuery implements SearchQuery) the query is correctly stored in the session, available for subsequent requests.
However, when I access another controller (say /searchAuthors.html using AuthorSearchQuery implements SearchQuery) the query from the last request (BookSearchQuery) is still being used for the new controller causing a ClassCastException later on.
I have tried moving the @SessionAttribute annotation from the support class to the implementation classes, to no avail.
Is there something I’m doing wrong or is this by design? What can I do?
Thanks a lot!
Using
@SessionAttributesthis objects will be stored in your HttpSession with the same name and they will be accessible (shared) from different controllers. So, Spring is acting correctly.I think the best approach in your scenario is rename this attribute in every subclass (“BookQuery”, “AutorQuery”, …). Not very elegant at all 🙁