自定义枚举类型检查
/*** 工单状态,使用字典:order_item_state*/ @CheckEnum(nullAble = true, enumType = OrderItemStateEnum.class) private String workState;
注解类
package com.gdyunst.core.tool.validation;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;/*** 校验是否是状态枚举中的项*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {CheckEnumValidation.class})
public @interface CheckEnum {String message() default "请输入字典中的状态类型";/*** 是否可以为空,true可以为空,当配置true并且传的值也是空,那就不做校验* @return*/boolean nullAble() default false;/*** 枚举类型* @return*/Class enumType();/*** 枚举中的方法名称,get方法,如:getType* @return*/String methodName() default "getType";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
配置类
package com.gdyunst.core.tool.validation;import cn.hutool.core.util.StrUtil;
import com.gdyunst.core.tool.util.EnumUtils;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;/*** 参数必须是状态字典校验*/
public class CheckEnumValidation implements ConstraintValidator<CheckEnum, String> {/*** 获取配置中是否为空*/private Class enumType;private boolean nullAble;private String methodName;@Overridepublic void initialize(CheckEnum checkEnum) {enumType = checkEnum.enumType();nullAble = checkEnum.nullAble();methodName = checkEnum.methodName();}/*** 传递的字典类型参数值* @param enumValue* @param constraintValidatorContext* @return*/@Overridepublic boolean isValid(String enumValue, ConstraintValidatorContext constraintValidatorContext) {// 配置了允许为空并且该值也是空,那就不去校验格式if (nullAble && StrUtil.isBlank(enumValue)) {return true;}if(StrUtil.isBlank(enumValue)){constraintValidatorContext.disableDefaultConstraintViolation();constraintValidatorContext.buildConstraintViolationWithTemplate("请输入字典字段参数").addConstraintViolation();return false;}if (StrUtil.isBlank(methodName)) {constraintValidatorContext.disableDefaultConstraintViolation();constraintValidatorContext.buildConstraintViolationWithTemplate("枚举中的字段必须配置").addConstraintViolation();return false;}if (enumType == null) {constraintValidatorContext.disableDefaultConstraintViolation();constraintValidatorContext.buildConstraintViolationWithTemplate("枚举对象必须配置").addConstraintViolation();return false;}Object stateEnum = EnumUtils.getEnumByLambda(enumValue, enumType, methodName);if(stateEnum == null) {constraintValidatorContext.disableDefaultConstraintViolation();constraintValidatorContext.buildConstraintViolationWithTemplate(String.format("请输入系统字典: %s 中的枚举值", enumType.getSimpleName())).addConstraintViolation();return false;}return true;}
}