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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:37:30