您的位置:首页 > 文旅 > 旅游 > spring boot自定义注解校验参数(枚举校验)

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

2024/10/6 18:22:48 来源:https://blog.csdn.net/wxz980927155/article/details/139772137  浏览:    关键词:spring boot自定义注解校验参数(枚举校验)

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

1.引入validation的starter

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2.创建校验的枚举基类

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

/*** 基础枚举参数* @author wxz*/
public interface IBaseEnumParam<T> {/** 获取code码** @return*/T getCode();/*** 获取描述信息* @return*/String getDesc();}

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

通过子类去校验参数

@AllArgsConstructor
public enum SexEnum implements IBaseEnumParam<Integer> {MAN(1,"男"),WOMAN(0,"女");/*** 编码*/private final Integer code;/*** 描述*/private final String desc;@Overridepublic Integer getCode() {return code;}@Overridepublic String getDesc() {return desc;}
}

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

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

/*** 枚举验证器* @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方法具体的验证实现

/*** 枚举验证器* @author wxz*/
public class EnumValidator implements ConstraintValidator<EnumValidate,Object> {private String[] enums;private Class<? extends IBaseEnumParam<?>> baseEnum;@Overridepublic 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;}@Overridepublic void initialize(EnumValidate constraintAnnotation) {this.enums = constraintAnnotation.enums();this.baseEnum = constraintAnnotation.baseEnum();}}

代码结束!

示例:

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com