2010-10-25 49 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和會話屬性沒有控制器之間共享。其實我一直在尋找相反的效果,這就是我的發現。

相關問題