使用 MapStruct 映射 Enum 字段

fee*_*ood 8 java enums spring-boot mapstruct

我想映射 2 个模型,其中每个模型都有几乎相同的枚举。让我展示:

\n\n

第一个模型有枚举:

\n\n
public enum EventSource {\n  BETRADAR("SOURCE_BETRADAR"),\n  BETGENIUS("SOURCE_BETGENIUS"),\n  BETCONSTRUCT("SOURCE_BETCONSTRUCT"),\n  MODEL("SOURCE_MODEL");\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二个模型有枚举:

\n\n
public enum SportEventSource implements ProtocolMessageEnum {\n  SOURCE_UNKNOWN(0),\n  SOURCE_BETRADAR(1),\n  SOURCE_BETGENIUS(2),\n  SOURCE_BETCONSTRUCT(3),\n  UNRECOGNIZED(-1);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有这样的自定义映射方法:

\n\n
@Named("eventSourceConverter")   \ndefault EventSource eventSourceConverter(SportEventSource source) {\n        switch (source) {\n          case SOURCE_MODEL:\n            return EventSource.MODEL;\n          case SOURCE_BETCONSTRUCT:\n            return EventSource.BETCONSTRUCT;\n          case SOURCE_BETGENIUS:\n            return EventSource.BETGENIUS;\n          case SOURCE_BETRADAR:\n            return EventSource.BETRADAR;\n          default:\n            return EventSource.MODEL;\n        }   \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我使用:

\n\n
  @Mapping(target = "mainSource", source = "source", qualifiedByName = "eventSourceConverter")\n  AdapterCompetitor protoToModel(Competitor proto);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但得到:

\n\n
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.\n  AdapterCompetitor protoToModel(Competitor proto);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还创建了枚举映射器,例如:

\n\n
  @ValueMappings({\n      @ValueMapping(source = "SOURCE_BETRADAR", target = "BETRADAR"),\n      @ValueMapping(source = "SOURCE_BETGENIUS", target = "BETGENIUS"),\n      @ValueMapping(source = "SOURCE_BETCONSTRUCT", target = "BETCONSTRUCT"),\n      @ValueMapping(source = "SOURCE_MODEL", target = "MODEL"),\n      @ValueMapping(source = "SOURCE_UNKNOWN", target = "MODEL"),\n      @ValueMapping(source = "UNRECOGNIZED", target = "MODEL")\n  })\n  EventSource eventSourceToSportEventSource(SportEventSource source);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我不需要单独拥有它,只是希望枚举字段将在内部映射中映射。当我这样做时,简单地说 \xe2\x80\x94AdapterCompetitor protoToModel(Competitor proto)枚举时, \xe2\x80\x94 也应该被映射。

\n\n

谢谢!

\n\n

PS 对我的工程师感到抱歉,希望我的问题有意义:)

\n

fee*_*ood -1

我用了

@Mapper(componentModel = "spring")
public interface ConverterMapper {
  @Named("UnitValueConverter")
  default Long unitValueConverter(UInt64Value value) {
    return value.getValue();
  }
Run Code Online (Sandbox Code Playgroud)

作为一个包含上面所有命名映射器的接口,然后我做

@Mapper(componentModel = "spring")
public interface EventMapper extends ConverterMapper
Run Code Online (Sandbox Code Playgroud)

问题是我没有在ConverterMapper接口中添加@Mapper注解

  • 说得通。仅供参考,似乎 `ConverterMapper` 仅适用于 utils。如果是这种情况,您不需要使用“@Mapper”对其进行注释。您还可以通过“Mapper#uses”添加任何实用程序,并使“unitValueConverter”成为静态方法。 (2认同)