当前位置: 首页 > 后端技术 > Java

自定义枚举值校验器

时间:2023-04-01 14:54:11 Java

前言定义一个枚举类,现在需要对传入的枚举值进行范围校验。@GetterpublicenumUserTypeEnum{STUDENT("1","Student"),TEACHER("2","Teacher");私有整数代码;私有字符串名称;UserTypeEnum(整数代码,字符串名称){this.code=code;this.name=名称;}}超出范围时,会报错。注解校试@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD,ElementType.METHOD})@Constraint(validatedBy=EnumValidatorHandler.class)public@interfaceEnumValidator{Classvalue();Stringmessage()default"入参值不在正确枚举中";字符串方法()默认“getCode”;类[]组()默认{};类[]payload()default{};}@Slf4jclassEnumValidatorHandler实现ConstraintValidator{privateListvalues=newArrayList<>();@Overridepublicvoidinitialize(EnumValidatorenumValidator){Classclazz=enumValidator.value();对象[]对象=clazz.getEnumConstants();尝试{Methodmethod=clazz.getMethod(enumValidator.method());对象值;for(Objectobj:objects){value=method.invoke(obj);价值观.add(值);}}catch(Exceptione){log.error("进程枚举验证异常:{}",e);}}@OverridepublicbooleanisValid(Objectvalue,ConstraintValidatorContextconstraintValidatorContext){if(valueinstanceofString){StringvalueStr=(String)value;返回StringUtils.isEmpty(valueStr)||值.包含(值);}返回Objects.isNull(值)||值.包含(值);}}用在entities中,在c层入参的参数中添加注解@EntitypublicclassUser{@EnumValidator(value=UserTypeEnum.class)privateStringuserType;}。添加@Valid注解publicUseradd(@ValidUseruser){}如果是为了其他层的入参校验,需要在抛出异常为ConstraintViolationException的类中添加@Validated注解。最后,添加一个全局异常处理程序来处理异常。除了自定义注解,还有常规的注解验证器: