Поле Map Enum с MapStruct - PullRequest
       99

Поле Map Enum с MapStruct

0 голосов
/ 19 июня 2020

Я хочу отобразить 2 модели, каждая из которых имеет почти одинаковые перечисления. Позвольте мне показать:

Первая модель имеет enum:

public enum EventSource {
  BETRADAR("SOURCE_BETRADAR"),
  BETGENIUS("SOURCE_BETGENIUS"),
  BETCONSTRUCT("SOURCE_BETCONSTRUCT"),
  MODEL("SOURCE_MODEL");

Вторая модель имеет enum:

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 protoToModel(Competitor proto), перечисление также должно отображаться.

Спасибо!

ps извините за мой eng, надеюсь, мои вопросы имеют смысл :)

1 Ответ

0 голосов
/ 30 июня 2020

Я использовал

@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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...