文章目录
引言
ValidationApi框架就是用来解决参数校验中代码冗余问题,它提供一些注解用来帮助我们对请求参数进行校验。但是在实际项目中经常需要自定义枚举类来限制参数类型,此篇文章笔者将带领大家解决这个问题。
一、引入Maven依赖
<!--参数校验-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!--提供一些字符串操作-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
<!--knife4j接口-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
二、自定义注解@EnumValid 用于对枚举类校验
/**
* 用于对枚举类校验的自定义注解
*/
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {EnumValidator.class})
@Documented
public @interface EnumValid {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<?>[] target() default {};
/**
* 允许的枚举
*
* @return
*/
Class<? extends Enum<?>> enumClass();
}
三、定义接口EnumValidate 用于实现枚举的校验
/**
* 用于实现枚举的校验
*/
public interface EnumValidate<T> {
/**
* 校验枚举值是否存在
*/
boolean existValidate(T value);
}
四、枚举校验器 用于校验EnumValidator
/**
* 枚举校验器
* 用于校验EnumValidator
*/
public class EnumValidator implements ConstraintValidator<EnumValid,String> {
private Class<? extends Enum> enumClass;
@Override
public void initialize(EnumValid enumValid) {
enumClass = enumValid.enumClass();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null || "".equals(value)) {
return true;
}
EnumValidate[] enums = (EnumValidate[]) enumClass.getEnumConstants();
if(enums ==null || enums.length == 0){
return false;
}
return enums[0].existValidate(value);
}
}
五、自定义枚举类 实现EnumValidate接口中的方法
@Getter
public enum SexEnun implements EnumValidate<String> {
SEX_MEN("1", "男"),
SEX_WOMEN("2", "女");
private final String sex;
private final String value;
SexEnun(String sex, String value){
this.sex = sex;
this.value = value;
}
/**
* 判断是否在枚举类当中
* @param value
* @return
*/
@Override
public boolean existValidate(String value) {
if (value == null || "".equals(value)) {
return false;
}
for (SexEnun testEnum : SexEnun.values()) {
if (testEnum.getSex().equalsIgnoreCase(value)) {
return true;
}
}
return false;
}
}
六、在用于参数接收的VO中使用刚才我们自定义的@EnumValid注解
public class StudentVO {
private String studentId;
@NotBlank(message = "学生姓名为必填项")
private String studentName;
@EnumValid(message = "学生性别参数有误!", enumClass = SexEnun.class)
private String studentSex;
}
七、在Controller参数接收的位置添加@Validated注解
@RestController
@RequestMapping("/***")
public class StudentController {
@Autowired
private StudentBpo studentBpo;
/**
* 新增学生信息
*/
@PostMapping("***")
public VResponse<Map<String, String>> saveStudent(@Validated @RequestBody StudentVO studentVO) {
String studentId = studentBpo.saveStudent(studentVO);
Map<String, String> map = new HashMap<>();
map.put("studentId", studentId);
return new VResponse<>(HttpStatus.OK, ResultEnum.SUCCESS_SAVE.getValue(), map);
}
}