前言
目录
spring-boot-validator参数校验系列(1)--------基本参数校验。
spring-boot-validator参数校验系列(2)--------分组校验
spring-boot-validator参数校验系列(3)--------自定义校验注解
spring-boot-validator参数校验系列(4)--------自定义参数校验异常
一、为什么要自定义注解?
因为常见的注解满足不了我们的业务需求,比如,我们限制某个属性只能是固定的值!
二、如何实现
(1)首先完成基本校验spring-boot-validator参数校验系列(1)--------基本参数校验。
(2)创建自定义注解
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; /** * @Description : 自定义校验注解 */ RetentionPolicy.RUNTIME) (ElementType.FIELD,ElementType.PARAMETER}) ({ //FixedValidatorClass 为执行判断逻辑实现类! validatedBy = FixedValidatorClass.class) (public @interface Fixed { String[] value() default {}; String message() default "请输入合法值!"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
(3)创建注解判断逻辑类
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.Arrays; import java.util.Objects; /** * 状态标记校验器 */ public class FixedValidatorClass implements //Fixed为我们自定的注解,查看ConstraintValidator可知, 第一个泛型参数必须继承Annotation,也就是必须是个注解 第二个参数为此注解支持的校验类型,可以理解为注解中的value返回类型 ConstraintValidator<Fixed,Object> { private String[] values; //初始化参数 public void initialize(Fixed fixed) { //根据用户填写的value值,来初始化此属性只支持的值! this.values = fixed.value(); } public boolean isValid(Object value, ConstraintValidatorContext context) { //具体的判断逻辑 //是否为null,以及初始化值中是否包传入的值. //false表示校验失败,参数不合法! return Objects.isNull(value) || Arrays.asList(values).contains(String.valueOf(value)); } }
(3)属性上增加自定义注解
我们的"老用户"了
public class MyPerson { message = "id不可为空!",groups = {Update.class}) ( private String id; max = 8,min = 1, message = "用户名超出长度范围!") ( private String name; //这里以性别为例,只能输入0(女),1(男) value = {"0","1"},groups = {Insert.class,Update.class},message = "请输入合法值!") ( private Integer sex; }
Controller代码,注意@Validated 位置,看过校验系列文章第一篇的老读者,应该知道这个注解可以写在类上面的,但是经测试,卸载类上,不生效,具体原因尚不清楚,使用时注意下!
"/custom") ( public void custom( MyPerson myPerson){ log.info("校验通过,用户信息为: {}",myPerson); }
PostMan访问
后台输出