# validator-demo
**Repository Path**: sayYi/validator-demo
## Basic Information
- **Project Name**: validator-demo
- **Description**: hibernate validator 试用、封装
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-12-08
- **Last Updated**: 2022-09-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# hibernate-validator组件试用
官方文档:
校验组件可以对字段、方法参数、方法返回值、内部类进行校验。
对于方法返回值的校验,可以提供更大的校验可能性,比如:
- 类中的字段不能全部为空
- 当类的某个字段为特定值时,另外一个字段不能为空
## 校验组件简介
基本使用
```java
private static Validator validator;
@BeforeClass
public static void prepare() {
final ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validator = validatorFactory.getValidator();
}
@Test
public void manufacturerIsNull() {
Car car = new Car(null, "DD-AB-123", 4);
final Set> validate = validator.validate(car);
assertEquals(1, validate.size());
assertEquals("不能为空", validate.iterator().next().getMessage());
}
```
校验逻辑
1. 同一个字段,多个校验逻辑,不管是否有校验不通过的逻辑,都会全部执行;
2. 不同字段,某个字段校验不通过,不影响其他字段的校验;
3. 数值为`null`时,除了NotNull注解,其他注解都会返回校验通过;
4. 数值为空字符串会触发校验。
## 原生校验
`javax.validation.constraints`
常用的一些校验
- NutNull:非空
- Size:集合或者字符串的长度
- Max、Min:数值大小
- DecimalMin、DecimalMax:高精度数值校验
- Digits:数据精度
- Email:email校验
- Pattern:正则表达式校验
- 日期相关的校验
注解中的参数值,可以在消息模版中直接获取`{参数名}`
```java
@NotNull(message = "车架号不能为空")
@Size(min = 17, max = 17, message = "车架号应为{min}位")
private String vin;
```
## hibernate提供的额外功能
### 消息参数
校验对象数值获取:`${validatedValue}`
```java
@Exist(value = "ids", message = "未知的id:${validatedValue}")
private String id;
```
自定义消息参数
在validator的valid方法中,进行自定义消息的处理
```java
HibernateConstraintValidatorContext hibernateContext = context.unwrap(
HibernateConstraintValidatorContext.class );
boolean valid = isValid(value);
if (!valid){
hibernateContext.disableDefaultConstraintViolation();
hibernateContext.addExpressionVariable("cachedValue", sets.get(value));
context.buildConstraintViolationWithTemplate(messageTemplate)
.addConstraintViolation();
}
```
## 自定义校验
1. 参考其他注解,编写注解类,关联验证组件
1. 如果要支持多种类型的数据校验,可以关联多个验证组件
2. 编写验证组件,实现`ConstraintValidator`
1. `initialize`方法,会获取到注解信息。会在校验类的时候初始化,需要注意其生命周期
2. `isValid`方法,执行实际的验证逻辑
通过提供静态的数据获取方法,来实现动态集合的设置、读取。
为了避免内存溢出,需要能够自动实现数据的设置、移除,因此选择在校验方法执行前后对缓存进行处理
### Exist
数据存在于数据集合的校验。难点:
- 动态的数据集合
### NotExist
数据不存在于数据集合的校验。难点:
- 动态数据集合
- 动态消息参数
### Unique
数据唯一性校验注解。从集合内部对象中提取标记字段的数据,判断是否存在重复。一般用于excel批量导入的场景,判断是否存在重复数据