引入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;
}