好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java实现自定义枚举值校验器的示例代码

前言

定义一个枚举类,现需要对传入的枚举值进行范围校验。

?

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实现自定义枚举值校验器的示例代码的详细内容...

  阅读:19次