Spring MVC:@SessionAttributes在控制器之间共享?

Phi*_*das 5 spring spring-mvc

我有一个搜索和结果列表的抽象控制器支持类:

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

    @ModelAttribute("query")
    public abstract Q createDefaultSearchQuery();
}
Run Code Online (Sandbox Code Playgroud)

几个实际的搜索控制器扩展了这个基类.

在访问其中一个控制器(比如/searchBooks.html使用BookSearchQuery implements SearchQuery)之后,查询被正确地存储在会话中,可用于后续请求.

但是,当我访问另一个控制器(比如/searchAuthors.html使用AuthorSearchQuery implements SearchQuery)时,来自最后一个请求()的查询BookSearchQuery仍在用于新控制器,从而导致ClassCastException稍后的操作.

我已经尝试将@SessionAttribute注释从支持类移动到实现类,但无济于事.

有什么我做错了还是这个设计?我能做什么?

非常感谢!

sin*_*pop 0

使用@SessionAttributes此对象将以相同的名称存储在您的 HttpSession 中,并且可以从不同的控制器访问(共享)它们。所以,Spring 的行为是正确的。

我认为您的场景中最好的方法是在每个子类中重命名此属性(“BookQuery”,“AutorQuery”,...)。一点也不优雅:(