Spring MVC:控制器之间共享@SessionAttributes?
问题内容:
我有一个抽象控制器支持类,用于搜索和结果列表:
@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
注释从支持类移动到实现类,但无济于事。
我在做错什么吗?还是这是设计使然?我能做什么?
非常感谢!
问题答案:
使用@SessionAttributes
此对象将以相同的名称存储在HttpSession中,并且可以从不同的控制器访问(共享)它们。因此,Spring运行正常。
我认为在您的方案中,最好的方法是在每个子类(“ BookQuery”,“ AutorQuery”,…)中重命名此属性。一点也不优雅:(