Spring MVC:发布后执行会话数据合并

时间:2012-09-13 16:08:54

标签: spring-mvc

我们看到Spring MVC存在一个问题/特性,因为当我们的请求到达控制器时,在我们的客户端JSP中删除的条目会重新出现。

以下是控制器中GET请求的片段:

AssignmentRulesFormDTO assignmentRulesFormDTO = ...
    model.addAttribute("assignmentRulesForm", assignmentRulesFormDTO);
    return new ModelAndView(getPageName(), model);

所以我们的AssignmentRulesFormDTO包含许多Rule对象,在我们的客户端,其中一个对象被删除。 我已通过Fiddler确认已删除的对象未传递给服务器。 但是,当它到达我们控制器的保存方法时,对象重新出现。 这是save方法的方法签名:

public ModelAndView saveRuleAttributesAndRules(@ModelAttribute("assignmentRulesForm")
AssignmentRulesFormDTO assignmentRulesForm, BindingResult bindingResult, HttpSession session, Principal principal,
    ModelMap model) {

所以看起来好像Spring在遇到我们的控制器之前正在执行某种合并。

因此,我想知道这个现象是什么,以及如何为这个特定的会话属性关闭它?

2 个答案:

答案 0 :(得分:0)

假设第二个代码段是@RequestMapping方法,我认为您不希望使用AssignmentRulesFormDTO注释标记@ModelAttributes。通过方法参数you are telling Spring to go and instantiate the AssignmentRulesFormDTO by executing the method annotated@ModelAttribute("assignmentRulesForm")使用此注释。

因此,当调度到@RequestMapping方法来处理POST时,Spring会采取以下措施:

  1. 找到合适的@RequestMapping方法
  2. 检查每个方法参数以查看是否存在所需数据
  3. 如果找到@ModelAttribute参数并且该属性在模型中尚不存在,则在控制器中找到填充@ModelAttribute
  4. 的方法
  5. 执行3
  6. 中的方法
  7. 最后执行@RequestMapping方法
  8. 因此,如果您的目标是仅使用请求正文填充@ModelAttribute ,则听起来不应该使用AssignmentRulesFormDTO对参数进行注释。相反,您可能需要to use @RequestBody

答案 1 :(得分:0)

我的控制器注释了@SessionAttributes,这似乎导致了问题。因此,一旦我删除了这个注释,就会在提交保存操作时创建一个全新的AssignmentRulesFormDTO。 @SessionAttributes似乎将请求中添加的数据混淆为现有的会话属性,因此上面的问题