Validator自定义注解校验枚举类型

版权申明:本文为原创文章,转载请注明原文出处

原文链接:https://blog.it-follower.com/posts/3658085992.html

SpringBoot需要引入spring-boot-starter-validation(使用Hibernate Validator 框架提供验证功能) 依赖进行参数校验,由于本项目中已经引入了spring-boot-starter-web 依赖(包含spring-boot-starter-validation依赖),就不需要重复引用了。但是该框架并没有提交对枚举的校验,本文将自己扩展一个枚举校验。

定义一个校验注解,类似于@NotNull @Size等等那样

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
/**
* 枚举校验注解
*
* @author ye17186
* @version 2019/3/6 15:53
*/
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValidator.class})
public @interface EnumValid {

String message() default "";

// 作用参考@Validated和@Valid的区别
Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

/**
* 目标枚举类
*/
Class<?> target() default Class.class;

/**
* 是否忽略空值
*/
boolean ignoreEmpty() default true;
}

自定义枚举校验的处理类,该类必须实现ConstraintValidator接口

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
* 枚举参数校验处理类
*
* @author ye17186
* @version 2019/3/6 15:56
*/
@Slf4j
public class EnumValidator implements ConstraintValidator<EnumValid, String> {

// 枚举校验注解
private EnumValid annotation;

@Override
public void initialize(EnumValid constraintAnnotation) {

annotation = constraintAnnotation;
}

@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
boolean result = false;

Class<?> cls = annotation.target();
boolean ignoreEmpty = annotation.ignoreEmpty();

// target为枚举,并且value有值,或者不忽视空值,才进行校验
if (cls.isEnum() && (StringUtils.isNotEmpty(value) || !ignoreEmpty)) {

Object[] objects = cls.getEnumConstants();
try {
Method method = cls.getMethod("name");
for (Object obj : objects) {
Object code = method.invoke(obj);
if (value.equals(code.toString())) {
result = true;
break;
}
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
log.warn("EnumValidator call isValid() method exception.");
result = false;
}
} else {
result = true;
}
return result;
}
}

代码中使用

1、定义一个枚举类

1
2
3
public enum TestEnum {
A, B, C
}

2、参数校验该枚举,注意接收参数类型必须为String,否则需要进行特殊处理才行

1
2
3
4
5
6
7
public class TestRequest implements Serializable {

private static final long serialVersionUID = -8739613309305982051L;

@EnumValid(target = TestEnum.class, message = "type取值必须为A, B, C")
private String type;
}

3、Controller中直接加上@Validated 或 @Valid即可

1
2
3
4
5
6
@RequestMapping("/test")
public String doSomething(@Validated @RequestBody TestRequest request) {
log.info("doSomething");
log.info(request.toString());
return "SUCCESS";
}

评论