java自定义枚举注解 @EnumValue  自动校验枚举值

文章展示了如何在Java中创建一个实体类`CacheRefreshReq`,该类使用自定义注解`@EnumValue`来确保字段`cacheContent`的值是`CacheContentEnum`枚举中的有效选项。`EnumValue`注解通过`EnumUtils`工具类检查输入值是否匹配枚举的代码,提供了数据校验的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值