使用@SessionAttributes的最佳实践

时间:2012-02-02 19:57:26

标签: spring spring-mvc

我正在尝试在Spring mvc应用程序中的两个控制器之间共享数据。

在Controller A中,我使用@SessionAttributes({“mymodel1”})注释了类,并在接收第一个GET请求的方法中将其添加到ModelMap中:

model.addAttribute("mymodel1", MyModel1);

我现在想从Controller B读取myModel1。 在这个控制器中,我有以下方法拦截POST请求,并且在其参数中已经有一个不同的模型:

public String processSubmit(@ModelAttribute("mymodel2") MyModel2 mymodel2, BindingResult result, SessionStatus status, HttpServletRequest httpRequest)

到目前为止,一切正常,我能够从processSubmit读取mymodel2但是如果我现在想要将另一个@ModelAttribute(“mymodel1”)MyModel1 mymodel1添加到此方法签名中,我原本希望能够读取我在控制器A中设置的值,但我得到的例外是第一个模型不再被识别。

所以我的问题是:如何从Controller B读取mymodel2?

2 个答案:

答案 0 :(得分:1)

@SessionAttributes

无法做到这一点
  

使用此注释指示的会话属性对应于特定处理程序模型属性,透明地存储在会话会话中。一旦处理程序指示其会话会话完成,将删除这些属性。因此,请将此工具用于此类会话属性,这些属性应在特定处理程序会话期间临时存储在会话中。

例如,当我想用​​Hibernate验证来验证元素时,我使用这个注释,在我提交页面后,SOME元素无效,我希望其余元素仍然在页面上,但这不是你的情况。我认为唯一的方法是:

HttpSession.getAttribute()

答案 1 :(得分:1)

上面的javadoc摘录是使用@SessionAttributes的最典型方式。然而,Joly所描述的也应该有效。会话属性通过DefaultSessionAttributeStore存储,默认情况下,在将属性名称存储在会话中时,不会为属性名称添加前缀。这意味着如果ControllerA和ControllerB都列出了一个名为“mymodel1”的属性,它们实际上是指同一个会话属性。您需要提供有关您所获得的错误以及实际控制器代码的更多信息。