2010-09-01 50 views
15

總之,我想是這樣的:如何與Spring MVC傳遞一個會話屬性的方法參數(參數)

public String action(@SessionAttribute User user) {..} 

,而不是

public String action(HttpSession session) { 
    User user = session.getAttribute("user"); 
} 

主要針對的緣故:

  • 可讀性
  • 單元測試
+0

相關:http://stackoverflow.com/questions/2213974/spring-mvc-session-attribute-access – Bozho 2010-09-01 19:12:17

+0

會話範圍的bean不是你需要的嗎? – skaffman 2010-09-01 19:18:00

+0

沒有。我如何將它們作爲方法參數傳遞?我不能注入它們,因爲控制器是單身人士。 – Bozho 2010-09-01 19:21:31

回答

19

我發現了一個solution

想法是爲AnnotationMethodHandlerAdapter註冊自定義WebArgumentResolver,該自定義註釋處理自定義註釋@SessionAttribute(或@SessionParam)。

發佈代碼的一個注意事項是,如果沒有指定value,則可以使用param.getParameterName()

+0

如果您擁有@SessionAttribute(必需= false)用戶用戶,該怎麼辦?作爲字符串返回的默認值與用戶不匹配。你能以某種方式管理嗎? – mickthompson 2011-01-14 16:01:49

+0

您可以管理解析器中的任何內容。 :) – Bozho 2011-01-14 17:19:00

0

即使我們使用@ModelAttribute(「user」)用戶用戶作爲方法參數,然後在您的方法中使用用戶對象,它將從會話中更新用戶。屬性名稱必須與會話屬性名稱「user」匹配。

public String myMethod(@ModelAttribute("user") User user){ 

System.out.println(user.getDetails()); 

} 
3

對於那些通過谷歌到達,至少4.3.2.RELEASE的,彈簧包括@SessionAttribute註釋內置:

public String action(
    @SessionAttribute(required=false, name="user") User user) { 

    // ... 

} 

自定義解決方案不再需要。

相關問題