Bean Validation 与 hibernate-validator

邵奇
2023-12-01

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


关于java与Jakarta(解卡达)

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>
 类似资料: