You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实体转DTO时枚举映射报错:No enum constant,求解决方案

问题原因

Java枚举的valueOf()方法是大小写严格匹配的。从错误信息可知,数据库中存储的是小写的plan,但你的VasOrPlanEnum枚举中对应的常量名称应为大写格式(比如PLAN),两者无法匹配,因此抛出No enum constant异常。

解决方案

以下是几种规范的解决方式:

方式一:给枚举添加自定义值与匹配方法(推荐)

这种方式遵循Java枚举编码规范(常量名大写),同时兼容API/数据库中的字符串格式:

1. 重新定义枚举类

给每个枚举常量绑定对应的字符串值,并提供静态方法用于匹配:

// VasOrPlanEnum 定义
public enum VasOrPlanEnum {
    VAS("VAS"),
    PLAN("plan"),
    BOTH("Both");

    private final String value;

    VasOrPlanEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    // 自定义匹配方法,支持精确匹配
    public static VasOrPlanEnum fromValue(String value) {
        if (value == null) {
            return null; // 或根据业务需求抛出异常
        }
        for (VasOrPlanEnum enumVal : VasOrPlanEnum.values()) {
            if (enumVal.value.equals(value)) {
                return enumVal;
            }
        }
        throw new IllegalArgumentException("无效的 vasOrPlan 值: " + value);
    }
}

// ModuleOrAppEnum 定义
public enum ModuleOrAppEnum {
    MODULE("module"),
    APP("app");

    private final String value;

    ModuleOrAppEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public static ModuleOrAppEnum fromValue(String value) {
        if (value == null) {
            return null;
        }
        for (ModuleOrAppEnum enumVal : ModuleOrAppEnum.values()) {
            if (enumVal.value.equals(value)) {
                return enumVal;
            }
        }
        throw new IllegalArgumentException("无效的 moduleOrApp 值: " + value);
    }
}

2. 修改映射函数

替换valueOf()为自定义的fromValue()方法:

default List<Answers> mapEntityToAnswerDto(
    List<RecommPlanAnswerEntity> recommPlanAnswerEntities) {
    return recommPlanAnswerEntities.stream()
        .map(recommPlanAnswerEntity -> Answers.builder()
                   .vasOrPlan(VasOrPlanEnum.fromValue(
                       recommPlanAnswerEntity.getRecommPlanAnswerFeatureMapping().getVasOrPlan()))
                   .moduleOrApp(ModuleOrAppEnum.fromValue(
                       recommPlanAnswerEntity.getRecommPlanAnswerFeatureMapping().getModuleOrApp()))
                   .build())
        .toList();
}

方式二:直接修改枚举常量名称(不推荐)

如果不需要遵循Java枚举编码规范,可以直接将枚举常量名称改为和API/数据库一致的格式:

public enum VasOrPlanEnum {
    VAS,
    plan,
    Both
}

这种方式虽然简单,但不符合Java代码规范,不建议在生产环境使用。

额外注意点

  • 如果数据库中moduleOrApp字段可能为空(实体类定义中无nullable=false),需要在fromValue()方法中先判断空值,避免空指针异常。
  • 如果需要兼容大小写不一致的情况,可以将匹配逻辑改为enumVal.value.equalsIgnoreCase(value)。

内容的提问来源于stack exchange,提问作者Pulkit Agrawal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:21:12