Bean Validation碎碎念
大家所知道的JSR 303,是参数校验Bean Validation的第一版规范,也称为Bean Validation 1.0,通过类似@Null,@NotNull,@NotBlank,@Valid的注解,帮助我们对参数进行校验。避免在业务代码中写长长的if else的判断。
但实际上,到2019年8月份的时候,这个参数校验的的规范已经到了到了Bean Validation 2.0 版本,规范也变了,Bean Validation 2.0是属于JSR 380的规范。中间历经了三个版本:
Bean Validation 1.0 (JSR303),发布于2009年,基于jdk1.6,对应的Hibernate Validator的版本是4.3.1.Final
Bean Validation 1.1 (JSR349),发布于2013年,基于jdk1.7,对应的Hibernate Validator的版本是5.1.1.Final
Bean Validation 2.0 (JSR380),发布于2019年8月份,基于jdk1.8,对应的Hibernate Validator的版本是6.0.1.Final
尽管现在Hibernate于2021-12-14发布了Hibernate Validator 7.0,但是其依赖于Jakarta Bean Validation 3.0,而Jakarta Bean Validation 3.0虽然是实现了Bean Validation 2.0标准,但是是基于jdk1.9的,所以我们目前jdk1.8的项目是没法使用的。或者是说,兼容性有问题。
版本关联参考地址:http://hibernate.org/validator/releases/,https://beanvalidation.org/2.0/
其实最新的Hibernate Validator 7.0版本发布于2021-12-14,它说依赖于Jakarta Bean Validation 3.0,但是bean validation的官网并未提及此事,对此我一直很懵逼,在官方论坛咨询了,也暂时没得到回复,https://discourse.hibernate.org/c/bean-validation/10。
还是说Jakarta Bean Validation 3.0 并不对应着Bean Validation 3.0?这不是误人子弟吗。后面在bing在搜了一下好像有点眉目,
Jakarta Bean Validation与Bean Validation 还真是不一样,Jakarta Bean Validation实现了Bean Validation,其中Jakarta Bean Validation 3.0实现了Bean Validation 2.0。原文是这么说的
runs on Java SE but is integrated in Java EE 6 and later; Bean Validation 2.0 is part of Java EE 8
发布于jdk1.9 我们现在还在用1.8,没必要了
This release is part of Jakarta EE 9.
Jakarta Bean Validation 3.0发布于2020-10-07,Jakarta Bean Validation 2.0发布于2019-09-10,
参考文档:https://projects.eclipse.org/projects/ee4j.bean-validation
2017 年 8 月,Oracle(甲骨文)决定将 Java EE(Java Enterprise Edition)移交给开源组织,最后 Eclipse 基金会接手。这应该是甲骨文实现对 Java 品牌控制的最新举措,尽管之前 Sun 的资产已经被甲骨文围剿得只剩一个 VirtualBox 还能喘口气。不过,甲骨文可不允许开源组织用 Java 的名号,于是 Eclipse 选出了 “Jakarta EE” 和"Enterprise Profile"两个后续按名字,最终前者以 64.4% 的票数获胜。
如果你的项目是基于jdk1.8的Spring-Boot项目,建议使用spring-boot-starter-validation就行,不要自己去添加validation-api的依赖,无论是java的validation-api还是jakarta的validation-api。
同时还有一点,如果你的项目版本是jdk1.8的,不要使用hibernate-validator 7.0的版本,它里面的依赖的jakarta.validation-api:3.0是需要jdk1.9的部分支持的,我们直接编译会报错。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>