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

时间:2010-10-25 16:09:08

标签: 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();
}

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

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

但是,当我访问另一个控制器(比如使用/searchAuthors.htmlAuthorSearchQuery implements SearchQuery)时,上一个请求(BookSearchQuery)中的查询仍在用于新控制器,导致{{1稍后。

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

有什么我做错了还是这个设计?我该怎么办?

非常感谢!

2 个答案:

答案 0 :(得分:4)

我刚刚在Spring 3.0.2上试过这个,并且会话属性不在控制器之间共享。事实上,我正在寻找相反的效果,这就是我发现的方式。

答案 1 :(得分:0)

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

我认为您方案中的最佳方法是在每个子类中重命名此属性(“BookQuery”,“AutorQuery”,...)。根本不是很优雅:(