【hibernate-validator】learning

本文深入解析JSR303 Bean Validation规范,详细介绍了Validator和ExecutableValidator接口的使用,探讨了beanconstraints的校验机制,包括触发条件、层叠校验及自定义约束实现。同时,分析了group继承与序列控制对校验的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一部分:对参考链接一做的阅读笔记。

笔记应该及时做,3.1.3节以前的记不太清了,现在从这里开始做一下阅读笔记。

先来说下一直以来的疑问,bean constraints是否会在任何使用该bean对象的地方被validate,触发validate的机制是什么。这两个其实是一个问题,如果有触发机制,则只在满足触发条件的使用bean对象的地方进行validate。查看目录2.2节是讲这块的,先总结下。得到 Validator接口实例是最重要的。最简单的方法是如下:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

Validator接口有三个方法,参数均可有group信息(var-arg,有几个group就接几个,和正常参数一样以逗号隔开),如未说明则为default validation group。返回值均为Set<ConstraintViolation>。

Validator.validate(bean object)

Validator.validateProperty(bean object, property name)

Validator.validateValue(bean class, property name, property value)

回到3.1.3节,@Valid作用于构造器或方法参数,可对构造器返回值(构造器是无返回值的,原文想表达的应该是构造器生成的对象)或方法参数作层叠校验。

method  constraints的校验使用ExecutableValidator接口。

Note that declaring method or constructor constraints itself does not automatically cause their validation upon invocation of the executable. Instead, the ExecutableValidator API (see Section 3.2, “Validating method constraints”) must be used to perform the validation, which is often done using a method interception facility such as AOP, proxy objects etc.

ExecutableValidator接口实例的方法如下:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
ExecutableValidator executableValidator = factory.getValidator().forExecutables();

ValidatorFactory实现了Validator和ExecutableValidator,需要哪个就返回哪个(通过相应方法的返回值类型将this转换)。

ExecutableValidator接口有4个方法:

validateParameters(bean object, method, values)(校验一个方法上的所有parameter constraints)

validateReturnValue(bean object, method, return value)

validateConstructorParameters(constructor, values)

validateConstructorReturnValue(constructor, bean object)(postCondition)

返回值均为Set<ConstraintViolation>,同样都有可变参数来声明对哪个group进行校验。

3.2.3节最后一个例子(这里),Path和Node属于javax.validation,PathImpl和NodeImpl属于org.hibernate.validator.internal.engine.path。Node是怎样将不同类型包装的有待研究。

5.2节group inheritance,校验时传递的group如果是另一个group的子类,则属于两个group中任意一个的constraint都需要校验。因此具有一种校验范围累加的效果。

5.3/5.4节通过group sequence控制校验顺序的两种用法。需要注意,@GroupSequence注释在类上用于改变类的默认Default Group时,效果是locale的,不会传播到该类的域对象下,即域对象的Default还是默认的,比如@GroupSequence({A.class})注释在类1上,类1有个域对象field1被@Valid注释,field1有个域field11的constraint是A Group,由于非扩散性,field1的Default并未改变,field11并不会校验。

6自定义constranit,分三步:

  • Create a constraint annotation

  • Implement a validator

  • Define a default error message

6.1.2.1结尾讲了ConstraintValidatorContext控制message的例子,涉及EL引擎,回过头来看4.1,其讲到resource bundle默认为ValidationMessages.properties,由程序员提供,也可为ValidationMessages_en_US.properties,默认情况下,JVM的默认locale将被用于搜索bundle。4.2.1讲到如果要从非ValidationMessages文件中检索message的话,可以参考Example 4.4。

ConstraintValidator有两个泛型参数,见6.1.2。

11.4并没有讲清在java EE场景下的常用例子,只是举了个用@Resource注入ValidatorFactory和Validator的例子。

看完了,method和constructor可以配置拦截器进行校验,bean对象的校验可以在bean初始化的时候进行吗?应该是初始化后进行的。文章发布后,查看自己的这篇文章,底下有一篇csdn推荐文章,点开看,发现解答了自己的疑惑。bean对象的校验是通过在method的参数上标记@Valid。

 

参考链接一

https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/?v=5.3#chapter-bean-constraints

参考链接二

https://blog.youkuaiyun.com/Gred01/article/details/78533390

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值