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”,…)中重命名此属性。一点也不优雅:(