有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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";
  }
}

。。。对象2从模型中清除。它不再作为@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


共 (2) 个答案

  1. # 1 楼答案

    你打电话表示对话结束

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

    看看这与手工将属性放入模型相比如何

  2. # 2 楼答案

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

    给定ModelMap modelHttpSession session,你会:

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