spring boot自定义注解校验参数(枚举校验)

引入spring boot的spring-boot-starter-validation实现自定义注解校验参数,实现校验枚举值参数数据是否合规,提高接口的安全性和开发效率。

1.引入validation的starter

xml 复制代码
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2.创建校验的枚举基类

创建IBaseEnumParam类的目的是为了统一枚举类的创建规则,能够通过继承的方式去校验参数值是否在枚举类当中。

java 复制代码
/**
 * 基础枚举参数
 * @author wxz
 */
public interface IBaseEnumParam<T> {

    /** 获取code码
     *
     * @return
     */
    T getCode();

    /**
     * 获取描述信息
     * @return
     */
    String getDesc();

}

3.创建基础枚举类的子类

通过子类去校验参数

java 复制代码
@AllArgsConstructor
public enum SexEnum implements IBaseEnumParam<Integer> {
    MAN(1,"男"),
    WOMAN(0,"女");

    /**
     * 编码
     */
    private final Integer code;
    /**
     * 描述
     */
    private final String desc;

    @Override
    public Integer getCode() {
        return code;
    }

    @Override
    public String getDesc() {
        return desc;
    }
}

4.创建校验的自定义注解

1.message,groups,payload字段默认带上
2.enums字段自定义传入字符串数组进行校验可以不用依赖枚举基类(适合不需要拓展的)
3.baseEnum字段传入IBaseEnumParam的子类进行校验(适合后期需要拓展的,不用修改校验代码)
4.@Constraint告诉validation是验证注解,EnumValidator.class验证的实现类

java 复制代码
/**
 * 枚举验证器
 * @author wxz
 */
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy ={EnumValidator.class})
public @interface EnumValidate {

    /**
     * 枚举的集合
     * @return
     */
    String[] enums() default {};

    /**
     * baseEnum
     * @return
     */
    Class<? extends IBaseEnumParam<?>> baseEnum();

    String message() default "枚举错误";

    Class<?>[] groups() default {};

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

5.校验规则实现

1.实现ConstraintValidator第一个泛型是验证注解,第二个泛型是需要验证的字段类型

2.initialize方法获取注解上的数据

3.isValid方法具体的验证实现

java 复制代码
/**
 * 枚举验证器
 * @author wxz
 */
public class EnumValidator implements ConstraintValidator<EnumValidate,Object> {

    private String[] enums;

    private Class<? extends IBaseEnumParam<?>> baseEnum;

    @Override
    public boolean isValid(Object val, ConstraintValidatorContext constraintValidatorContext) {
        // 优先执行基础的枚举判断
        if (Objects.nonNull(baseEnum)){
            IBaseEnumParam<?>[] enumConstants = baseEnum.getEnumConstants();
            for (IBaseEnumParam<?> baseEnumParam : enumConstants){
                if (Objects.equals(String.valueOf(baseEnumParam.getCode()),String.valueOf(val))){
                    return true;
                }
            }
            return false;
        }
        if (this.enums == null || this.enums.length == 0){
            return true;
        }
        for (String enumVal : enums){
            if (Objects.equals(enumVal,String.valueOf(val))){
                return true;
            }
        }
        return false;
    }

    @Override
    public void initialize(EnumValidate constraintAnnotation) {

        this.enums = constraintAnnotation.enums();
        this.baseEnum = constraintAnnotation.baseEnum();
    }

}

代码结束!

示例:

java 复制代码
	@PostMapping("/role/edit")
    @ApiOperation(value = "编辑角色",notes = "编辑角色 有id更新 无id新增")
    public BizResult<Void> roleEdit(@RequestBody @Validated RoleEditDTO roleEditDTO){
        sysRoleService.roleEdit(roleEditDTO);
        return BizResult.success();
    }
    
	@Data
	@ApiModel("RoleEditDTO")
	public class RoleEditDTO {

	    @ApiModelProperty("id 有则修改 无则新增")
	    private Long id;
	
	    @ApiModelProperty("名称")
	    @Length(min = 1, max = 50, message = "名称长度超出范围")
	    private String roleName;
	
	    @ApiModelProperty("编码")
	    @Length(min = 1, max = 50, message = "编码长度超出范围")
	    private String roleCode;
	
	    @ApiModelProperty("状态 0 可用 1 不可用")
	    @EnumValidate(baseEnum = StatusEnum.class,message = "状态的值错误")
	    private Integer status;

	}
相关推荐
wangjialelele2 小时前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发
历程里程碑2 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
李日灐2 小时前
C++进阶必备:红黑树从 0 到 1: 手撕底层,带你搞懂平衡二叉树的平衡逻辑与黑高检验
开发语言·数据结构·c++·后端·面试·红黑树·自平衡二叉搜索树
晔子yy2 小时前
如何设计让你的程序同时处理10w条数据
java
Yvonne爱编码2 小时前
链表高频 6 题精讲 | 从入门到熟练掌握链表操作
java·数据结构·链表
lpfasd1232 小时前
物联网后端岗位java面试题
java·物联网·php
毕设源码李师姐2 小时前
计算机毕设 java 基于 java 的图书馆借阅系统 智能图书馆借阅综合管理平台 基于 Java 的图书借阅与信息管理系统
java·开发语言·课程设计
忆~遂愿2 小时前
Runtime 上下文管理:计算实例的生命周期、延迟最小化与上下文切换优化
java·大数据·开发语言·人工智能·docker
powerfulhell2 小时前
寒假python作业5
java·前端·python
1尢晞12 小时前
Java学习
java·开发语言