2010-10-25 50 views
5

我对搜索和结果列表的抽象控制器支持类: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)之后,查询被正确存储在会话中,可用于后续请求。

然而,当我从最后一个请求(BookSearchQuery)访问另一个控制器(使用AuthorSearchQuery implements SearchQuery/searchAuthors.html)查询仍然被用于新的控制器造成ClassCastException以后。

我曾尝试将@SessionAttribute注解从支持类移至实现类,但无济于事。

有什么我做错了或是由设计?我能做什么?

非常感谢!

回答

0

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

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

+0

我希望Spring会以某种方式限定会话上下文中属性的名称和控制器名称,我不能重命名属性名称,因为我在抽象控制器的方法中使用了模型bean名称(“query”)。任何想法? – 2010-10-26 16:37:23

+0

对不起,没有想法,我认为你想要的是不可能的。 – sinuhepop 2010-10-27 09:44:01

+0

很伤心......非常感谢! – 2010-10-27 22:49:59

4

我只是想在这个春季3.0.2和会话属性没有控制器之间共享。其实我一直在寻找相反的效果,这就是我的发现。

相关问题