前言
定义一个枚举类,现需要对传入的枚举值进行范围校验。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Getter public enum UserTypeEnum { STUDENT([ 1 ], "学生" ), TEACHER([ 2 ], "老师" );
private Integer code; private String name;
UserTypeEnum(Integer code, String name) { this .code = code; this .name = name; } } |
当超出范围时,报错。
注解校验
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Documented @Retention (RetentionPolicy.RUNTIME) @Target ({ElementType.FIELD, ElementType.METHOD}) @Constraint (validatedBy = EnumValidatorHandler. class ) public @interface EnumValidator { Class<?> value();
String message() default "入参值不在正确枚举中" ; String method() default "getCode" ; Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {}; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
@Slf4j class EnumValidatorHandler implements ConstraintValidator<EnumValidator, Object> { private List<Object> values = new ArrayList<>();
@Override public void initialize(EnumValidator enumValidator) { Class<?> clazz = enumValidator.value(); Object[] objects = clazz.getEnumConstants(); try { Method method = clazz.getMethod(enumValidator.method()); Object value; for (Object obj : objects) { value = method.invoke(obj); values.add(value); } } catch (Exception e) { log.error( "处理枚举校验异常:{}" , e); } }
@Override public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) { if (value instanceof String) { String valueStr = (String)value; return StringUtils.isEmpty(valueStr)|| values.contains(value); } return Objects.isNull(value) || values.contains(value); } } |
使用
在实体类的属性上加入注解
1 2 3 4 5 |
@Entity public class User { @EnumValidator (value = UserTypeEnum. class ) private String userType; } |
在c层入参的参数上加入@Valid注解
1 2 |
public User add( @Valid User user) { } |
如果是其他层的入参校验,需要所在类上加入 @Validated 注解。
他抛出的异常为 ConstraintViolationException ,
最后,加入一个全局异常处理器处理异常。
除了自定义的注解,还有常规的注解校验器
到此这篇关于Java实现自定义枚举值校验器的示例代码的文章就介绍到这了,更多相关Java枚举值校验器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
原文链接:https://segmentfault.com/a/1190000043452861
查看更多关于Java实现自定义枚举值校验器的示例代码的详细内容...