为什么没有initbinder调用提交表单?

时间:2014-01-29 09:55:02

标签: spring spring-mvc

我有一个表单,但是当我提交表单时,我的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中的值和我的模型属性的名称是相等的。 那么为什么它不起作用?

谢谢

2 个答案:

答案 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方法。