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