pom添加依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
编写自定义校验注解
自定义校验注解 看个人需求命名,例如如下自定义注解 @ListValue
/**
* 是否删除 ,显示状态
*/
@ListValue(vals={0,1},groups = {AddGroup.class})
private Integer showStatus;
需求: 为字段showStatus添加自定义 校验 只能填写 0 和 1 的值
自定义了 校验注解@ListValue
groups = {AddGroup.class}) 是分组校验
AddGroup规定添加有效
要想自定义注解生效,就需要 自定义校验器 。
指定校验注解
一个自定义校验注解必须满足规范,在JSR303 规范中校验注解必须满足三个属性(以@NotBlank 注解为例):
//校验出错误信息去哪里取 默认使用JSR303的ValidationMessages.properties 文件中取
String message() default "{javax.validation.constraints.NotBlank.message}";
//支持分组校验功能
Class<?>[] groups() default {};
//一些负载信息
Class<? extends Payload>[] payload() default {};
校验注解必须标注源信息数据
@Documented
//使用哪一个校验器
@Constraint(
validatedBy = {}
)
//tatget 注解可以标注在哪些位置
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
//运行时获取
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(NotBlank.List.class)
因此新建一个注解类 命名为 ListValue
package com.xrp.common.valid;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* @author Dell
* @date 2020/9/8 14:44
* @Description
*/
@Documented
//指定校验器
@Constraint(
validatedBy = {ListValueConstraintValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
//错误提示值一般为校验注解类的全类名.message ListValue 的全类名
String message() default "{com.dell.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
//定义注解@ListValue(vals={0,1},groups = {AddGroup.class}) vals值默认为空数组
int [] vals () default { };
}
新建一个配置文件 为 ValidationMessages.properties ,配置文件中配上:
com.dell.common.valid.ListValue.message = 数值错误
properties 若中文乱码 建议使用unicode码
编写自定义校验器
新建类 ListValueConstraintValidator 实现 ConstraintValidator<T1,T2> 接口 声明两个泛型,第一个泛型:校验注解,第二个泛型 校验的字段类型
并实现初始化方法,和 判断校验是否成功方法
package com.xrp.common.valid;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
/**
* @author dell
* @date 2020/9/8 14:55
* @Description
*/
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set = new HashSet<>();
/**
* 初始化方法
*/
@Override
public void initialize(ListValue constraintAnnotation) {
// 说明给定的值 @ListValue(vals={0,1},groups = {AddGroup.class}) vals声明的值
int[] vals = constraintAnnotation.vals();
for (int val : vals) {
//声明的值存入set
set.add(val);
}
}
/**
* 判断是否校验成功
* value:提交过来需要校验的值(传的参)
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
//判断提交的值是否在set中
return set.contains(value);
}
}
关联自定义校验器和自定义校验注解
最后, 在注解类 @Constraint(
validatedBy = {ListValueConstraintValidator.class} )
中指定 ListValueConstraintValidator自定义校验器