1

我们看到了 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 在它到达我们的控制器之前正在执行某种合并。

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

4

2 回答 2

0

假设第二个片段是一种@RequestMapping方法,我认为您不想AssignmentRulesFormDTO@ModelAttributes注释标记。通过在方法参数上使用这个注解,告诉 Spring 去实例AssignmentRulesFormDTO@ModelAttribute("assignmentRulesForm").

因此,Spring 在分派给您的@RequestMapping方法来处理时所做的POST是:

  1. 找到合适的@RequestMapping方法
  2. 检查每个方法参数以查看是否存在所需的数据
  3. 如果@ModelAttribute找到一个参数并且该属性在模型中尚不存在,则在控制器中找到填充该参数的方法@ModelAttribute
  4. 执行3中找到的方法
  5. 最后执行@RequestMapping方法

@ModelAttribute因此,如果您的目标是AssignmentRulesFormDTO填充请求正文,则听起来您不应该注释参数。相反,您可能想要使用.@RequestBody

于 2012-09-13T16:24:14.277 回答
0

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

于 2012-09-13T20:22:10.763 回答