我有一个表单,但是当我提交表单时,我的initbinder不会拦截我的帖子请求。 这是我的启动器:
@InitBinder(value="confermaDto")
protected void initBinderDto(final WebDataBinder binder, final Locale locale) {
binder.registerCustomEditor(MyClass.class, myClassEditor);
}
这是我截取帖子的方法:
@RequestMapping(value="confermaDati", method = RequestMethod.POST)
public String confermaDati(@Valid final ConfermaDatiAttrezzaturaDto confermaDto,
final BindingResult bindingResult, final Model uiModel, final HttpServletRequest httpServletRequest) {
if (bindingResult.hasErrors()) {
uiModel.addAttribute("message", "Errore Salvataggio");
uiModel.addAttribute("dto", confermaDto);
}
uiModel.asMap().clear();
return "redirect:/";
}
我认为它应该有效,因为initbinder中的值和我的模型属性的名称是相等的。 那么为什么它不起作用?
谢谢
答案 0 :(得分:3)
如果未在RequestMapping注释方法中指定ModelAttribute值您必须在@Initbinder
anotation的value属性中指定类所需的名称,首字母 NOT 大写。
答案 1 :(得分:3)
此init-binder方法应该应用于的命令/表单属性和/或请求参数的名称。
默认是应用于所有命令/表单属性以及由带注释的处理程序类处理的所有请求参数。 在此处指定模型属性名称或请求参数名称将init-binder方法限制为那些特定属性/参数,使用不同的init-binder方法通常应用于不同的属性或参数组。
以上来自@InitBinder
的{{3}}。
在代码中指定要使用的模型属性的名称,即confermaDto
。但是在您的请求处理方法中,没有模型属性的概念(即没有任何内容用@ModelAttribute
注释)。
public String confermaDati(@Valid final ConfermaDatiAttrezzaturaDto confermaDto, final BindingResult bindingResult, final Model uiModel, final HttpServletRequest httpServletRequest) { ... }
你有一个用@Valid
注释的参数只会触发验证,Spring也会实例化这个对象并将请求中的值放到它上面但是 NOT 指定为模型属性。在@Valid
注释旁边添加@ModelAttribute
注释。 (或者从@InitBinder
注释中删除名称,以便始终应用它)。
我认为它应该有效,因为initbinder中的值和我的model属性的名称是相等的。那么为什么它不起作用?
简而言之,回答这个问题,方法参数名称相等但没有模型属性。因此没有触发@InitBinder
方法。