java – 在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说:

… attributes will be removed once
the handler indicates completion of
its conversational session.

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

任何人都可以解释这个行为,还是一个bug?

你通过打电话来表示完成对话

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(); }

并且看看如何比较把手中的属性放在模型中.

翻译自:https://stackoverflow.com/questions/1371392/when-do-sessionattributes-in-springmvc-get-removed-with-code-sample

转载注明原文:java – 在SpringMVC中的@SessionAttributes何时被删除? (带代码示例)