什么时候SpringMVC中的@SessionAttributes被删除了? (带代码示例)

在什么情况下@SessionAttributes被清除? 尝试在页面中使用两个模型时,我发现了一些令人困惑的行为。

当我使用此控制器执行GET后跟POST时…

@Controller @RequestMapping("/myPage*") @SessionAttributes(value = {"object1", "object2"}) public class MyController { @RequestMapping(method = RequestMethod.GET) public String get(Model model) { model.addAttribute("object1", new Object1()); model.addAttribute("object2", new Object2()); return "myPage"; } @RequestMapping(method = RequestMethod.POST) public String post(@ModelAttribute(value = "object1") Object1 object1) { //do something with object1 return "myPage"; } } 

… object2从模型中清除。 它不再作为@SessionAttribute存在,无法在我的视图页面上访问。

但是如果第二种方法的签名被修改为……

 public String post(@ModelAttribute(value = "object1") Object1 object1, @ModelAttribute(value = "object2") Object2 object2) { 

…然后object2不会从模型中清除,并且在我的视图页面上可用。

@SessionAttributes的javadoc说:

…一旦处理程序指示其会话会话完成,将删除…属性。

但是我没有看到我在第一个例子中如何表示会话会话的完成,而在第二个例子中没有。

任何人都可以解释这种行为或它是一个错误吗?

您通过致电表明对话已完成

SessionStatus.setComplete

 public void post(...., SessionStatus status) { status.setComplete(); } 

也就是说,我不明白为什么你应该失去一个模型属性而不是另一个。

你有没有尝试过这样的事情:

 @ModelAttribute("object1") public Object object1() { return new Object(); } @ModelAttribute("object2") public Object object2() { return new Object(); } 

并且看看如何比较手动将属性放入模型中。

您可以删除单个会话级别的ModelAttribute,如下所示:

给定ModelMap modelHttpSession session和你做:

 if (categoryId != null) model.addAttribute("categoryId", categoryId); else { model.remove("categoryId"); session.removeAttribute("categoryId"); }