BaseEnum.java 枚举基类
package com.bomb.xmypromo.common.enums;
/**
* 枚举基类
*/
public interface BaseEnum {
String getEnumCode();
String getEnumDesc();
}
EnumUtils.java 枚举工具类
package com.bomb.xmypromo.common.enums;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.stream.Stream;
/**
* 枚举工具类
*/
public final class EnumUtils {
public static <T extends BaseEnum> T getByCode(Class<T> enumClazz, String code){
BaseEnum[] values;
try {
Method method = enumClazz.getMethod("values");
method.setAccessible(true);
values = (BaseEnum[]) method.invoke(enumClazz);
} catch (Exception e){
throw new RuntimeException(e);
}
BaseEnum result = Stream.of(values)
.filter(baseEnum -> baseEnum.getEnumCode().equals(code))
.findFirst()
.orElse(null);
return result == null ? null : (T) result;
}
public static boolean isValidCode(Class<? extends BaseEnum> enumClazz, String code){
return getByCode(enumClazz, code) != null;
}
public static JSONArray toJsonArray(Class<? extends BaseEnum> enumClazz){
JSONArray array = new JSONArray();
try {
Method method = enumClazz.getMethod("values");
method.setAccessible(true);
BaseEnum[] values = (BaseEnum[]) method.invoke(enumClazz);
Arrays.stream(values).forEach(enumValue -> {
JSONObject json = new JSONObject();
json.put("code", enumValue.getEnumCode());
json.put("desc", enumValue.getEnumDesc());
array.add(json);
});
} catch (Exception e) {
throw new RuntimeException(e);
}
return array;
}
}
CacheContentEnum.java 测试枚举类
package com.bomb.xmypromo.common.enums;
import lombok.Getter;
/**
* 缓存内容
*/
@Getter
public enum CacheContentEnum implements BaseEnum {
//
CUSTOMER_CACHE("CUSTOMER_CACHE", "客户缓存"),
ORDER_CACHE("ORDER_CACHE", "订单缓存"),
PRODUCT_CACHE("PRODUCT_CACHE", "产品缓存");
private String code;
private String desc;
CacheContentEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
@Override
public String getEnumCode() {
return code;
}
@Override
public String getEnumDesc() {
return desc;
}
}
EnumValue.java 自定义注解类 @EnumValue
package com.bomb.xmypromo.common.annotations;
import com.bomb.xmypromo.common.enums.BaseEnum;
import com.bomb.xmypromo.common.enums.EnumUtils;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EnumValue.Validator.class)
public @interface EnumValue {
String message() default "{custom.value.invalid}";
boolean nullable() default false;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends BaseEnum> enumClass();
class Validator implements ConstraintValidator<EnumValue, Object> {
private Class<? extends BaseEnum> enumClass;
boolean nullable = false;
@Override
public void initialize(EnumValue enumValue) {
enumClass = enumValue.enumClass();
nullable = enumValue.nullable();
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
if (value == null && nullable) {
return Boolean.TRUE;
}
if(value == null && !nullable){
return Boolean.FALSE;
}
if (enumClass == null) {
return Boolean.TRUE;
}
String enumCode = (String)value;
return EnumUtils.isValidCode(enumClass, enumCode);
}
}
}
实体类 使用自定义注解@EnumValue 校验指定的枚举值是否存在
package com.bomb.xmypromo.common.dto.request;
import com.bomb.xmypromo.common.annotations.EnumValue;
import com.bomb.xmypromo.common.enums.CacheContentEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 在运维平台主动刷新缓存
*/
@Data
@ApiModel
public class CacheRefreshReq {
@ApiModelProperty("缓存内容")
@EnumValue(enumClass = CacheContentEnum.class, message = "取值不合法,参考:CacheContentEnum")
private String cacheContent;
}