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;

	}
相关推荐
HanhahnaH7 分钟前
Spring集合注入Bean
java·spring
未定义.22113 分钟前
电子削铅笔刀顺序图详解:从UML设计到PlantUML实现
java·软件工程·uml
雾月5530 分钟前
LeetCode 1292 元素和小于等于阈值的正方形的最大边长
java·数据结构·算法·leetcode·职场和发展
丘山子41 分钟前
一些鲜为人知的 IP 地址怪异写法
前端·后端·tcp/ip
CopyLower1 小时前
在 Spring Boot 中实现 WebSockets
spring boot·后端·iphone
IT小辉同学1 小时前
Docker如何更换镜像源提高拉取速度
spring cloud·docker·eureka
24k小善1 小时前
Flink TaskManager详解
java·大数据·flink·云计算
想不明白的过度思考者2 小时前
Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
java·开发语言
.生产的驴2 小时前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
猿周LV2 小时前
JMeter 安装及使用 [软件测试工具]
java·测试工具·jmeter·单元测试·压力测试