为什么我的Spring3验证程序要验证模型上的所有内容?

为什么我的Spring3验证程序要验证模型上的所有内容?,spring,validation,spring-mvc,Spring,Validation,Spring Mvc,我有一个Spring3控制器,其中一个方法有一个验证器。它坚持验证模型上的每个对象。有谁能向我解释一下为什么会这样,或者我做错了什么 根据文档5.7.4.3配置JSR-303验证器供Spring MVC使用() 对于JSR-303,单个javax.validation.Validator实例通常会验证声明验证约束的所有模型对象。要使用SpringMVC配置JSR-303支持的验证器,只需将JSR-303提供程序(如Hibernate验证器)添加到类路径中即可。SpringMVC将检测到它,并在所

我有一个Spring3控制器,其中一个方法有一个验证器。它坚持验证模型上的每个对象。有谁能向我解释一下为什么会这样,或者我做错了什么

根据文档5.7.4.3配置JSR-303验证器供Spring MVC使用()

对于JSR-303,单个javax.validation.Validator实例通常会验证声明验证约束的所有模型对象。要使用SpringMVC配置JSR-303支持的验证器,只需将JSR-303提供程序(如Hibernate验证器)添加到类路径中即可。SpringMVC将检测到它,并在所有控制器上自动启用JSR-303支持

例如:

@Controller
public class WhaleController {

        @Autowired
        private Validator myValidator;

        @Autowired
        private WhaleService whaleService;

        @InitBinder
        protected void initBinder(WebDataBinder binder) {
                binder.setValidator(this.myValidator);
        }

        @RequestMapping(value="/save-the-whales")
        @Transactional
        public void saveTheWhales(@Valid WhaleFormData formData, BindingResult errors, Model model) {
                if (!errors.hasFieldErrors()) {
                        Whale whale = new Whale();

                        whale.setBreed( formData.getBreed() );

                        this.whaleService.saveWhale( whale );

                        model.addAttribute("whale", whale);

                }
                model.addAttribute("errors", errors.getFieldErrors());
        }

}
运行时,它会抱怨Whale是myValidator的无效目标(myValidator被设置为验证WhaleFormData,并且做得很好)。Whale是一个POJO,没有任何验证约束、注释和配置。通过反复试验,我发现放置在模型上的任何对象都会尝试进行验证,如果验证器没有设置来处理它,则会失败。原语很好

有谁能告诉我为什么会这样,给我指出合适的文档和/或告诉我在没有验证的情况下在模型上放置东西的最佳方法吗

在上面的例子中,我想将“whale”放在模型上,因为它现在将有一个唯一的whaleId(),它从我的持久层接收


谢谢

我猜文档中没有很好地介绍这种行为

该问题是由以下原因引起的:

  • 默认情况下,
    @InitBinder
    -为每个非基本模型属性调用带注释的方法,包括传入和传出属性(为传出属性调用该方法的目的是允许您注册自定义
    属性编辑器
    ,在呈现表单时,表单标记使用这些属性)

  • DataBinder.setValidator()
    包含一个防御性检查,该检查调用
    Validator.supports()
    并在返回
    false
    时引发异常。因此,没有尝试执行验证,只是提前检查

  • 解决方案是将
    @InitBinder
    的范围限制为特定属性:

    @InitBinder("whaleFormData")
    protected void initBinder(WebDataBinder binder) { ... }
    

    有鉴于此,
    @Valid
    属性的作用是什么?谢谢。我在想:收藏品是否以特殊的方式处理?为什么如果我向模型中添加colleciton以在下拉列表中显示值,则不会发生错误?