✅P69_品牌管理-JSR303自定义校验注解
大约 2 分钟
自定义校验注解
cfmall-common/pom.xml
导入自定义校验需要的依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
自定义注解首先要满足JSR303的规范,即要有message、groups、Payload三个属性。参考@NotNull注解
package com.gyz.common.valid;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface ListValue {
String message() default "{com.gyz.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] vals() default { };
}
校验信息提示配置文件
cfmall-common
模块 resources 文件下新建 ValidationMessages.properties
com.gyz.common.valid.ListValue.message=必须提交指定的值
自定义校验器 ConstraintValidator
自定义校验器要实现ConstraintValidator接口,接口中的两个泛型分别指:需要校验的注解
和 注解需要校验的数据类型
package com.gyz.common.valid;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
/**
* @Description
* @Author GongYuZhuo
* @Version 1.0.0
*/
public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {
private final Set<Integer> set = new HashSet<>();
/**
* 初始化方法
* 参数:自定义注解的详细信息
*/
@Override
public void initialize(ListValue constraintAnnotation) {
int[] values = constraintAnnotation.vals();
for (int val : values) {
set.add(val);
}
}
/**
* 判断是否校验成功
*
* @param value 需要校验的值
* @param context
* @return
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
接口定义了两个方法,一个是初始化方法,一个是校验方法 。
- 初始化方法的参数是一个ListValue注解的对象也就可以获取对象的属性;
- 校验方法的第一个参数就是传递进来需要校验的数据
关联自定义校验器和自定义校验注解
关联自定义校验器
关联自定义注解 cfmall-product/src/main/java/com/gyz/cfmall/product/entity/BrandEntity.java
@NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})
@ListValue(vals = {0, 1}, groups = {AddGroup.class, UpdateStatusGroup.class})
private Integer showStatus;
乱码解决
测试过程中发现乱码提示信息解决方法:
先将ValidationMessages.properties
文件删除,取消提示默认勾选,设置如下
设置成功后再次创建文件,并对 common工程和product工程 进行maven的clean、install操作,保证设置更新成功。