我们看到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在遇到我们的控制器之前正在执行某种合并。
因此,我想知道这个现象是什么,以及如何为这个特定的会话属性关闭它?
答案 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会采取以下措施:
@RequestMapping
方法@ModelAttribute
参数并且该属性在模型中尚不存在,则在控制器中找到填充@ModelAttribute
@RequestMapping
方法因此,如果您的目标是仅使用请求正文填充@ModelAttribute
1>,则听起来不应该使用AssignmentRulesFormDTO
对参数进行注释。相反,您可能需要to use @RequestBody
。
答案 1 :(得分:0)
我的控制器注释了@SessionAttributes
,这似乎导致了问题。因此,一旦我删除了这个注释,就会在提交保存操作时创建一个全新的AssignmentRulesFormDTO。 @SessionAttributes
似乎将请求中添加的数据混淆为现有的会话属性,因此上面的问题