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
成为静态方法。