后端数据校验(JSR303/JSR-349/JSR-380、javax validation、hibernate validation、spring validation)

后端数据校验如:请求参数不能为null、数值至少为5、email参数符合邮箱地址规则等,通常涉及到上述几种工具,其区别:

  • JSR303/JSR-349/JSR-380、javax validation:都是JSR定义的标准,只定义了规范,不提供实现。三者分别为1.0(2009推出)、1.1(2013推出)、2.0(2019推出)版本。他们规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,位于javax.validation.constraints包下。关于几个版本的演进对比可参阅此 文章
  • hibernate validation是对该规范的实现(不要将hibernate和数据库orm框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如@Email,@Length,@Range等等,他们位于org.hibernate.validator.constraints包下。除了Hibernate Validation外,还有Apache BVal等实现,但前者用得最多,成为了事实上的标准实现(JSR-380规范制定的负责人就职于Hibernate,水到渠成)。
  • spring对hibernate validation进行了二次封装以方便使用,其在springmvc模块中添加了自动校验并将校验信息封装进了特定的类中、还支持指定groups以进行分组校验。以此可见,下面说到的分组是Spring validation提供的功能

可见,在Spring中使用validation时实际起作用的是Hibernate框架提供的实现。但是,我们在使用时最好用规范,这样可以在不改变代码的情况下选用其他具体实现。

注:上述用于校验的注解称为约束注解,专名为"Constraint",为行文方便,后文用该词。

 

使用

maven依赖

Java 数据校验自动化(Bean Validation)
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
View Code

相关文章: