为什么我的Spring 3验证程序验证模型中的所有内容?

我有一个弹簧3控制器和一个验证器的方法之一。 它坚持验证模型上的每个对象。 任何人都可以向我解释为什么这样做,或者如果我做错了什么?

根据文档,5.7.4.3配置供Spring MVC使用的JSR-303 Validator(http://static.springsource.org/spring/docs/3.0.0.RC3/spring-framework-reference/html/ch05s07。 HTML)

通过JSR-303,单个javax.validation.Validator实例通常会验证声明验证约束的所有模型对象。 要使用Spring MVC配置JSR-303支持的Validator,只需将一个JSR-303提供程序(如Hibernate Validator)添加到您的类路径中即可。 Spring MVC将检测到它并自动启用跨所有控制器的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());
        }

}

运行时,它会抱怨鲸鱼是myValidator的无效目标(它被设置为验证WhaleFormData,并且很好)。 鲸鱼是一个POJO,没有验证约束,注释和任何地方都没有配置。 通过试验和错误,我发现放置在模型上的ANY对象将尝试进行验证,如果验证程序未设置为处理它,则会失败。 原始人很好。

任何人都可以告诉我为什么会这样,请指出相应的文档和/或告诉我在模型上放置某些东西而不验证它的最佳方式?

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

谢谢!


我猜这个行为在文档中没有涉及到。

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

  • 默认情况下,为每个非基本模型属性(传入和@InitBinder )调用@InitBinder -annotated方法(为@InitBinder属性调用它的目的是为了允许您注册自定义PropertyEditor ,在渲染时使用表单标记形成)。

  • DataBinder.setValidator()包含一个调用Validator.supports()的防御性检查,如果返回false则会引发异常。 所以,没有尝试进行验证,只是一个早期检查。

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

    @InitBinder("whaleFormData")
    protected void initBinder(WebDataBinder binder) { ... }
    
    链接地址: http://www.djcxy.com/p/61089.html

    上一篇: Why is my Spring 3 Validator Validating Everything on the Model?

    下一篇: Cross field validation with Hibernate Validator (JSR 303)