该注解本质还是遍历枚举类,判断是否包含该值
- 定义注解
/**
* 枚举code校验注解
*
* @author Lynn
* @date 2022/7/6 18:21
*/
@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {EnumValidator.class})
public @interface EnumValid {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<?>[] target() default {};
Class<? extends Enum<?>> enumClass();
}
- 注解的实现
/**
* EnumValidator注解校验器
*
* @author Lynn
* @date 2022/7/6 18:25
*/
public class EnumValidator implements ConstraintValidator<EnumValid, Object> {
private Class<? extends Enum> enumClass;
@Override
public void initialize(EnumValid enumValid) {
enumClass = enumValid.enumClass();
}
@SuppressWarnings(value = {"unchecked"})
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
if (value instanceof String){
if (StringUtils.isBlank((CharSequence) value)) {
return true;
}
}
EnumValidate[] enums = (EnumValidate[]) enumClass.getEnumConstants();
if (enums == null || enums.length == 0) {
return false;
}
return enums[0].codeValidate(value);
}
}
- 定义接口 existValidate()方法, 给Enum实现
/**
5. @author Lynn
6. @date 2022/7/6 18:38
*/
public interface EnumValidate<T> {
/**
* 校验枚举值是否存在
*
* @param value T
* @return boolean
*/
boolean existValidate(T value);
}
- Enum实现EnumValidate接口, 重写existValidate()方法
/**
* @author Lynn
* @date 2022/7/4 20:08
*/
@Getter
@AllArgsConstructor
public enum MemberTypeEnum implements EnumValidate<String> {
/**
* 弱会员
*/
WEAK_MEMBER("0", "弱会员"),
/**
* 强会员
*/
STRENGTH_MEMBER("1", "强会员"),
;
private String code;
private String message;
/**
* 校验枚举值是否存在
*
* @param value String
*/
@Override
public boolean existValidate(String value) {
if (StringUtils.isBlank(value)) {
return false;
}
for (MemberTypeEnum memberTypeEnum : MemberTypeEnum.values()) {
if (memberTypeEnum.getCode().equalsIgnoreCase(value)) {
return true;
}
}
return false;
}
}
- 如何使用
/**
4. @author Lynn
5. @date 2022/4/15 10:58
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MemberPageRequest extends PageRequest {
/**
* 会员卡号
*/
private String memberNo;
/**
* 会员类型
*/
@EnumValid(message = "会员类型输入错误", enumClass = MemberTypeEnum.class)
private String memberType;
}
- Controller加上@Valid 或者 @Validated注解
/**
* 会员分页查询
*
* @param request MemberPageRequest
* @return PageInfo<MemberPageResponse>
*/
@PostMapping("/findPage")
public PageInfo<MemberPageResponse> findPage(@RequestBody @Valid MemberPageRequest request) {
checkValidation(request);
MemberManageDto dto = EntityConverterUtils.convert(request, MemberManageDto.class);
return EntityConverterUtils.convertPage(memberManageService.findPage(dto), MemberPageResponse.class);
}