# 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批量导入的场景,判断是否存在重复数据