2010-02-09 59 views
14

我想從會話範圍讀取一個域對象(UserVO)。Spring 3.0設置並獲取會話屬性

我設置了UserVO在一個名爲WelcomeController控制器

@Controller 
@RequestMapping("/welcome.htm") 
public class WelcomeController { 
@RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(BindingResult result, SessionStatus status,HttpSession session){ 
     User user = loginService.loginUser(loginCredentials); 
    session.setAttribute("user", user); 
     return "loginSuccess"; 
    } 
} 

我能夠使用對象<h1>${user.userDetails.firstName}</h1>

JSP頁面,但我無法從另一個控制器讀取的值,

我想讀會話屬性如下:

@Controller 
public class InspectionTypeController { 
@RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST) 
public String addInspectionType(InspectionType inspectionType, HttpSession session) 
{ 
      User user = (User) session.getAttribute("user"); 
      System.out.println("User: "+ user.getUserDetails().getFirstName); 

     } 
} 
+0

你好嗎?什麼是確切的問題 – Bozho 2010-02-09 07:30:19

+0

我現在對你有同樣的問題。你有沒有找到其他解決方案? – 2011-06-23 04:37:27

回答

39

您顯示的代碼應該工作 - HttpSession在控制器之間共享,並且您使用的是相同的屬性名稱。因此,你沒有向我們展示的東西出了問題。但是,無論它是否有效,Spring都會使用@SessionAttribute註釋(請參閱docs)提供更優雅的方法來保持會話中的模型對象。

例如(我沒有測試過這一點,但它給你的想法):

@Controller 
@RequestMapping("/welcome.htm") 
@SessionAttributes({"user"}) 
public class WelcomeController { 
    @RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(ModelMap modelMap){ 
     User user = loginService.loginUser(loginCredentials); 
     modelMap.addtAttribute(user); 
     return "loginSuccess"; 
    } 
} 

然後

@Controller 
@SessionAttributes({"user"}) 
public class InspectionTypeController { 

    @RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST) 
    public void addInspectionType(InspectionType inspectionType, @ModelAttribute User user) { 
     System.out.println("User: "+ user.getUserDetails().getFirstName); 
    } 
} 

但是,如果你原來的代碼不工作,那麼這也不起作用,因爲你的會話有其他問題。

+1

我來這裏尋找第一個解決方案('@ SessionAttributes'),我得到的只是'java.lang.IllegalStateException:在響應提交後無法創建會話' – 2012-01-26 07:37:49

+1

這似乎與@karpaczio說的矛盾...有人可以確認哪一個是正確的?我會認爲會話屬性是共享的,不管有沒有問題的@ @ Controller,但我沒有深入研究'@ SessionAttribute'的內部工作。 – Andy 2013-02-06 22:20:11

+2

@Andy看到我對karpaczio的回答評論 – 2013-03-02 17:33:19

6

@SessionAttributes只能在特定處理程序的上下文中使用,因此在WelcomeController中設置的屬性僅在此控制器中可見。

+5

你說的是Spring版本的情況<= 3.1.2.RELEASE。從3.1.2.RELEASE開始,@SessionAttributes在不同的控制器之間按預期持久化 – 2013-03-02 17:32:33

+1

@Denis Kniazhev參見[here](http://docs.spring.io/spring-framework/docs/3.2.0.M2/api/組織/ springframework的/ WEB /綁定/註解/ SessionAttributes。html) 對於在特定處理程序的對話過程中應暫時存儲在會話中的會話屬性,使用SessionAttributes。對於永久會話屬性,例如一個用戶身份驗證對象,請改用傳統的session.setAttribute方法。 – lolotron 2013-10-25 14:38:43

2

使用父類來繼承所有控制器並在那裏使用SessionAttributes。只是這個類應該在mvc的包掃描中。

0

可能你還沒有將UserVO設置爲Serializable。