使用 MapStruct 映射枚举字段
Map Enum field with MapStruct
我想映射 2 个模型,其中每个模型都有几乎相同的枚举。让我展示一下:
第一个模型有枚举:
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 protoToModel(Competitor proto)
enum 时也应该被映射。
谢谢!
p.s。对不起我的工程师,希望我的问题有意义:)
我用过
@Mapper(componentModel = "spring")
public interface ConverterMapper {
@Named("UnitValueConverter")
default Long unitValueConverter(UInt64Value value) {
return value.getValue();
}
作为一个包含所有命名映射器的接口,然后我做
@Mapper(componentModel = "spring")
public interface EventMapper extends ConverterMapper
问题是我没有在 ConverterMapper
接口中添加 @Mapper 注解
这可以使用 @ValueMapping
来实现
我想映射 2 个模型,其中每个模型都有几乎相同的枚举。让我展示一下:
第一个模型有枚举:
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 protoToModel(Competitor proto)
enum 时也应该被映射。
谢谢!
p.s。对不起我的工程师,希望我的问题有意义:)
我用过
@Mapper(componentModel = "spring")
public interface ConverterMapper {
@Named("UnitValueConverter")
default Long unitValueConverter(UInt64Value value) {
return value.getValue();
}
作为一个包含所有命名映射器的接口,然后我做
@Mapper(componentModel = "spring")
public interface EventMapper extends ConverterMapper
问题是我没有在 ConverterMapper
接口中添加 @Mapper 注解
这可以使用 @ValueMapping
来实现