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

5

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

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

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

多个实际搜索控制器扩展了这个基类。

在访问其中一个控制器(例如使用BookSearchQuery实现SearchQuery/searchBooks.html)后,查询正确地存储在会话中,并可用于随后的请求。

然而,当我访问另一个控制器(例如使用AuthorSearchQuery实现SearchQuery/ searchAuthors.html )时,上次请求的查询(BookSearchQuery )仍然被用于新的控制器,导致之后出现 ClassCastException

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

我做错了什么或设计有问题吗? 我该怎么办?

非常感谢!

2个回答

4
我刚刚在Spring 3.0.2上尝试了这个方法,但是控制器之间并没有共享会话属性。实际上,我当时正在寻找相反的效果,结果才发现这一点。

0

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

我认为在您的情况下最好的方法是在每个子类中重命名此属性(“BookQuery”,“AutorQuery”等)。这并不是非常优雅的解决方案 :(


我曾希望Spring能够以某种方式将会话上下文中属性的名称与控制器名称进行关联。我无法重命名属性名称,因为我在抽象控制器的方法中使用了模型bean名称(“query”)。有什么想法吗? - Philipp Jardas
抱歉,我没有想法,而且我认为你想要的是不可能的。 - sinuhepop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接