使用MapStruct映射两个模型枚举字段遇报错问题
解决MapStruct枚举映射报错且无需单独定义映射方法的方案
你遇到的问题核心是MapStruct默认会严格校验枚举的所有常量是否都有对应的映射关系——哪怕你写了自定义的@Named转换方法,它依然会因为未显式声明所有枚举常量的映射规则而抛出错误。下面提供两种无需单独定义独立枚举映射方法的解决方案:
方案一:直接在映射方法上声明@ValueMappings
你可以把枚举的映射规则直接绑定到protoToModel方法上,通过@ValueMappings覆盖SportEventSource的所有常量,MapStruct会自动处理该字段的枚举转换,完全不需要额外写方法:
@Mapper public interface YourMapperInterface { @ValueMappings({ @ValueMapping(source = "SOURCE_BETRADAR", target = "BETRADAR"), @ValueMapping(source = "SOURCE_BETGENIUS", target = "BETGENIUS"), @ValueMapping(source = "SOURCE_BETCONSTRUCT", target = "BETCONSTRUCT"), @ValueMapping(source = "SOURCE_UNKNOWN", target = "MODEL"), @ValueMapping(source = "UNRECOGNIZED", target = "MODEL") }) @Mapping(target = "mainSource", source = "source") AdapterCompetitor protoToModel(Competitor proto); }
注意:你原自定义方法里的case SOURCE_MODEL是无效逻辑,因为SportEventSource并没有这个枚举常量,所以在@ValueMappings里也不需要处理它。
方案二:保留自定义@Named方法,关闭枚举映射校验
如果你想继续使用自定义的switch逻辑,可以在@Named方法上添加@EnumMapping注解,告诉MapStruct你已经处理了所有未映射的枚举常量,从而跳过校验:
@Mapper public interface YourMapperInterface { @Named("eventSourceConverter") @EnumMapping(unmappedValueStrategy = EnumMapping.UnmappedValueStrategy.RETURN_DEFAULT) default EventSource eventSourceConverter(SportEventSource source) { switch (source) { case SOURCE_BETCONSTRUCT: return EventSource.BETCONSTRUCT; case SOURCE_BETGENIUS: return EventSource.BETGENIUS; case SOURCE_BETRADAR: return EventSource.BETRADAR; default: return EventSource.MODEL; } } @Mapping(target = "mainSource", source = "source", qualifiedByName = "eventSourceConverter") AdapterCompetitor protoToModel(Competitor proto); }
unmappedValueStrategy = RETURN_DEFAULT会让MapStruct知晓:所有未在switch里显式处理的枚举常量(比如SOURCE_UNKNOWN、UNRECOGNIZED)都会走默认分支返回EventSource.MODEL,和你的自定义逻辑完全匹配,因此会停止校验未映射的枚举常量。
这两种方案都不需要单独定义独立的枚举映射方法,直接在protoToModel方法的上下文里完成了枚举字段的映射。
内容的提问来源于stack exchange,提问作者fee1good
相关产品推荐
相关产品推荐

