数据校验
数据校验是任何一个应用程序都会用到的功能,无论是显示层还是持久层. 通常,相同的校验逻辑会分散在各个层中, 这样,不仅浪费了时间还会导致错误的发生(译注: 重复代码). 为了避免重复, 开发人员经常会把这些校验逻辑直接写在领域模型里面, 但是这样又把领域模型代码和校验代码混杂在了一起, 而这些校验逻辑更应该是描述领域模型的元数据.
使用数据校验,可以保证数据的正确性;
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 |
验证是否是合法的邮件地址 | |
@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);
}