Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVC中的@SessionAttributes何时被删除?(带代码示例)_Java_Spring_Session_Spring Mvc_Controller - Fatal编程技术网

Java SpringMVC中的@SessionAttributes何时被删除?(带代码示例)

Java SpringMVC中的@SessionAttributes何时被删除?(带代码示例),java,spring,session,spring-mvc,controller,Java,Spring,Session,Spring Mvc,Controller,@SessionAttributes在什么具体情况下被清除?在一个页面中尝试使用两个模型时,我发现了一些令人困惑的行为 当我用这个控制器做一个GET后接一个POST @Controller @RequestMapping("/myPage*") @SessionAttributes(value = {"object1", "object2"}) public class MyController { @RequestMapping(method = RequestMethod.GET)

@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";
  }
}
…对象2从模型中清除。它不再作为@SessionAttribute存在,无法在我的查看页面上访问

但是,如果第二个方法的签名修改为此

public String post(@ModelAttribute(value = "object1") Object1 object1,
                   @ModelAttribute(value = "object2") Object2 object2) {
…然后object2不会从模型中清除,并且可以在“我的视图”页面上使用

@SessionAttributes的javadoc说:

。。。属性将被删除一次 该处理程序指示已完成 它的对话会议

但在第一个例子中,我看不出我是如何表示对话结束的,但在第二个例子中,我看不到


有人能解释一下这种行为吗?还是它是一个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(); }

并查看这与手动将属性放入模型相比如何。

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

给定
ModelMap模型
HttpSession会话
,您可以:

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

我尝试了你的建议——令人惊讶的是,它奏效了!现在我真的很困惑。为什么手动设置模型属性和使用@modeldattribute设置模型属性有区别?唉,我犯了一个错误。参考(3.0.0.M3):“注意:@modeldattribute注释的方法将在所选@RequestMapping注释的处理程序方法之前执行”。因此,有效的原因是object1和object2方法在get和post方法之前执行。这可能是你真正想要的,但我怀疑不是。是的,在我发表评论后我意识到了这一点。我可能会向Spring提出这个问题,因为我看不到对这种行为的任何合理解释。这个问题已经向Spring提出:这个问题现在已经在Spring 3.0RC1中得到解决。谢谢Juergen!此问题现已在Spring 3.0RC1中解决。谢谢你,杰尔根!