SpringBoot使用validation-api实现对枚举类参数的校验


引言

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);
    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值