实体转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
相关产品推荐
相关产品推荐

