Spring Boot——JSR303数据校验

542 阅读3分钟

数据校验

数据校验是任何一个应用程序都会用到的功能,无论是显示层还是持久层. 通常,相同的校验逻辑会分散在各个层中, 这样,不仅浪费了时间还会导致错误的发生(译注: 重复代码). 为了避免重复, 开发人员经常会把这些校验逻辑直接写在领域模型里面, 但是这样又把领域模型代码和校验代码混杂在了一起, 而这些校验逻辑更应该是描述领域模型的元数据.

使用数据校验,可以保证数据的正确性;

JSR

JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。

JSR303

JSR303是Java为Bean数据合法性校验所提供的一个标准规范,叫做 Bean Validation。2009年12月 Java EE6发布, Bean Validation作为一个重要特性被包含其中,用于对 Java Bean中的字段值进行验证。官方参考实现是 Hibernate Validator。

JSR303官网jcp.org/en/jsr/deta…

Hibernate Validator官网 www.hibernate.org/subprojects…

Bean Validation为 JavaBean验证定义了相应的元数据类型和API。在应用程序中,通过在Bean属性上标注类似于 @NotNull,@Max等标准的注解指定校验规则,并通过标注的验证接口对Bean进行验证。 Bean Validation是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。

JSR303注解:

注解功能
@Notnull验证对象是否不为mul,无法检査长度为0的字符串,于验证基本数据类型
@Null验证对象是否为null
@AssertTrue验证 Boolean对象是否为true
@AssertFalse验证 Boolean对象是否为false
@Max(value)验正Number和String对象是否小于等于指定的值
@Min(value)验正Number和String对象是否大于等于指定的值
@DecimalMax(value)被标注的值必须不大于约束中指定的最大值。这个约束的参数是一个通过 Big Decimal定义的最大值的字符串表示,小数存在精度
@DecimalMin(value)被标注的值必须不小于约束中指定的最小值。这个约束的参数是一个通过 Big Decimal定义的最小值的字符串表示,小数存在精度
@Digits(integer, fraction)验证字符串是否是符合指定格式的数字, Interger指定整数精度, fraction指定小数精度
@Size(min, max)验证对象(Array、Collection、Map、 String)长度是否在给定的范围之内
@Past验证Date和 Calendar对象是否在当前时间之前
@Pattern验证 String对象是否符合正则表达式的规则
@NotBlank检查约束字符串是不是Null,被Trim的长度是否大于0。只对字符串,且会去掉前后空格
@URL验证是否是合法的url
@Email验证是否是合法的邮件地址
@CreditCardNumber验证是否是合法的信用卡号码
@Length(min, max)验证字符串的长度必须在指定的范围内
@NotEmpty检査元素是否为NULL或者 EMPTY。用于Array、Collection、Map、 String
@Range(min, max, message)验证属性值必须在合适的范围内

如何使用JSR303校验

这里来写个注解让name只能支持Email格式

Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated  //开启数据校验支持
public class Person {
    @Email(message="格式错误") //name必须是邮箱格式,message自定义错误信息
    private String name;
}

application.yaml文件为,下面的name不是邮箱格式,待会运行的时候一定会报错

person:
  name: 万里 
  age: 3
  happy: true
  birthday: 2021/4/25
  maps: {k1: v1,k2: v2}
  lists:
    - code
    - music
    - game
  dog:
    name: 刘狗
    age: 3

运行一下

@SpringBootTest
class Springboot02ConfigApplicationTests {
    @Autowired
    private Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }

在这里插入图片描述