我有一个表单,但是当我提交它时,我的initbinder不会拦截我的发帖请求。
这是我的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中的值与我的模型属性的名称相等。
那为什么不起作用呢?

谢谢

最佳答案

应该使用此init-binder方法的命令/表单属性和/或请求参数的名称。
默认值是应用于由注释的处理程序类处理的所有命令/表单属性和所有请求参数。在此指定模型属性名称或请求参数名称会将init-binder方法限制为那些特定的属性/参数,而通常将不同的init-binder方法应用于不同的属性或参数组。

以上是来自@InitBinderjavadoc
在代码中,指定要使用的模型属性的名称,即confermaDto。但是,在您的请求处理方法中,没有模型属性的概念(即@ModelAttribute不会注释任何内容)。

public String confermaDati(@Valid final ConfermaDatiAttrezzaturaDto confermaDto, final BindingResult bindingResult, final Model uiModel, final HttpServletRequest httpServletRequest) { ... }

您有一个用@Valid注释的参数,它将仅触发验证,Spring还将实例化该对象并将请求中的值放到该对象上,但是未将其指定为模型属性。在@Valid批注旁边添加@ModelAttribute批注。 (或从@InitBinder批注中删除该名称,以便始终将其应用)。

我认为它应该起作用,因为initbinder中的值和我的模型属性的名称相等。那为什么不起作用呢?

简而言之,要回答这个问题,方法参数名称是相等的,但是没有模型属性。因此,不会触发@InitBinder方法。

09-28 09:51