Java 使用MapStruct映射枚举字段
我想映射两个模型,其中每个模型都有几乎相同的枚举。让我展示一下: 第一个模型具有枚举:Java 使用MapStruct映射枚举字段,java,spring-boot,enums,mapstruct,Java,Spring Boot,Enums,Mapstruct,我想映射两个模型,其中每个模型都有几乎相同的枚举。让我展示一下: 第一个模型具有枚举: public enum EventSource { BETRADAR("SOURCE_BETRADAR"), BETGENIUS("SOURCE_BETGENIUS"), BETCONSTRUCT("SOURCE_BETCONSTRUCT"), MODEL("SOURCE_MODEL"); public enum SportEventSource implements ProtocolMes
public enum EventSource {
BETRADAR("SOURCE_BETRADAR"),
BETGENIUS("SOURCE_BETGENIUS"),
BETCONSTRUCT("SOURCE_BETCONSTRUCT"),
MODEL("SOURCE_MODEL");
public enum SportEventSource implements ProtocolMessageEnum {
SOURCE_UNKNOWN(0),
SOURCE_BETRADAR(1),
SOURCE_BETGENIUS(2),
SOURCE_BETCONSTRUCT(3),
UNRECOGNIZED(-1);
第二个模型具有枚举:
public enum EventSource {
BETRADAR("SOURCE_BETRADAR"),
BETGENIUS("SOURCE_BETGENIUS"),
BETCONSTRUCT("SOURCE_BETCONSTRUCT"),
MODEL("SOURCE_MODEL");
public enum SportEventSource implements ProtocolMessageEnum {
SOURCE_UNKNOWN(0),
SOURCE_BETRADAR(1),
SOURCE_BETGENIUS(2),
SOURCE_BETCONSTRUCT(3),
UNRECOGNIZED(-1);
我有这样的自定义映射方法:
@Named("eventSourceConverter")
default EventSource eventSourceConverter(SportEventSource source) {
switch (source) {
case SOURCE_MODEL:
return EventSource.MODEL;
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);
但是你可以得到:
error: The following constants from the property "SportEventSource source" enum have no corresponding constant in the "*source*" enum and must be mapped via adding additional mappings: SOURCE_UNKNOWN, SOURCE_BETRADAR, SOURCE_BETGENIUS, SOURCE_BETCONSTRUCT, UNRECOGNIZED.
AdapterCompetitor protoToModel(Competitor proto);
我还创建了枚举映射器,如:
@ValueMappings({
@ValueMapping(source = "SOURCE_BETRADAR", target = "BETRADAR"),
@ValueMapping(source = "SOURCE_BETGENIUS", target = "BETGENIUS"),
@ValueMapping(source = "SOURCE_BETCONSTRUCT", target = "BETCONSTRUCT"),
@ValueMapping(source = "SOURCE_MODEL", target = "MODEL"),
@ValueMapping(source = "SOURCE_UNKNOWN", target = "MODEL"),
@ValueMapping(source = "UNRECOGNIZED", target = "MODEL")
})
EventSource eventSourceToSportEventSource(SportEventSource source);
但我不需要单独设置,只希望枚举字段映射到内部映射中。简单地说,当我做AdapterCompetitor ProtoModel(Competitor ProtoModel)
枚举时,也应该映射
谢谢
p、 对不起我的英语,希望我的问题有意义:)
@Mapper(componentModel = "spring")
public interface ConverterMapper {
@Named("UnitValueConverter")
default Long unitValueConverter(UInt64Value value) {
return value.getValue();
}
作为一个包含所有命名映射器的接口,如上面所述,然后我
@Mapper(componentModel = "spring")
public interface EventMapper extends ConverterMapper
问题是我没有将@Mapper注释添加到
ConverterMapper
interface这可以通过使用实现。嗨,也许我误解了这个问题,但是为什么不能在主映射器中使用@ValueMappings方法并将其用作自定义映射?我如何知道mapstruct生成与您的方法相同的逻辑。再见,你好,亚历克斯!感谢链接,我已经使用它生成了单枚举映射方法(请参见EventSourceToPorteventSource),但不确定如何在主映射中使用@ValueMappings来映射对象的确切字段PermapStruct“按类型”进行映射,如果您只是将带有@ValueMappings的方法添加到主映射类中,默认情况下,主映射方法将使用此方法映射枚举。我认为这应该是开箱即用的。你所犯的错误很奇怪。你能不能把你的整个地图绘制程序和对象添加到问题中。根据您目前提供的信息,这应该可以正常工作(没有错误消息)嘿@Filip,很高兴在这里看到核心MapStruct团队的成员:)MapStruct工作正常,这是我的错误,详细信息见公认的答案。谢谢有道理。仅供参考,ConverterMapper
似乎只适用于UTIL。如果是这种情况,则不需要使用@Mapper
对其进行注释。您还可以通过Mapper\uses
添加任何util,并使您的unitValueConverter
成为静态方法。