Mapstruct - 发现用于映射的模糊映射方法 属性
Mapstruct - Ambiguous mapping methods found for mapping property
我正在使用 mapstruct 从一个 DTO 映射到另一个。我有多个默认方法,但其中 2 个具有 return String 值并且使用相同的 class 作为输入参数给我 "Ambiguous mapping methods using java Mapstruct" 错误。我在这里添加代码的相关部分:
@Mappings({
@Mapping(source = "programInstance", target = "title", qualifiedByName = "title"),
@Mapping(source = "programInstance", target = "seriesName", qualifiedByName = "seriesName"),
@Mapping(source = "programInstance", target = "season", qualifiedByName = "season"),
@Mapping(source = "programInstance", target = "epNumber", qualifiedByName = "epNumber"),
})
DTO1 mapDTOs (DTO2 dto2);
@Named("title")
default String mapTitle(Program programInstance) {
Optional<String> title = Utils.getObject(() -> programInstance.getTitle().getDescriptions().get(0).getValue());
if (title.isPresent())
return title.get();
return null;
}
@Named("seriesName")
default String mapSeriesName(Program programInstance) {
Optional<String> seriesName = Utils.getObject(() -> programInstance.get(0).getProgram().getTitle().getDescriptions().get(0).getValue());
if (seriesName.isPresent())
return seriesName.get();
return null;
}
@Named("season")
default Integer mapSeasonNumber(Program programInstance) {
Optional<Integer> season = Utils.getObject(() -> programInstance.get(0).getSeasonOf().get(0).getOrderNo());
if (season.isPresent())
return season.get();
return null;
}
@Named("epNumber")
default Integer mapEpNumber(Program programInstance) {
Optional<Integer> epNumber = Utils.getObject(() -> programInstance.getEpOf().get(0).getOrderNo());
if (epNumber.isPresent())
return epNumber.get();
return null;
}
错误是
Ambiguous mapping methods found for mapping property "Program
programInstance" to java.lang.String: java.lang.String mapTitle(),
java.lang.String mapSeriesName().
我检查了你的例子。问题是你尝试定位的字段是字符串类型。
所以:
public class IvpVodOfferStatusDTO {
private String seasonNumber;
private String episodeNumber;
}
MapStruct 尝试将其与您提供的签名相匹配:
@Named("season")
default Integer mapSeasonNumber(Program programInstance) {
Optional<Integer> season = Utils.getObject(() -> programInstance.get(0).getSeasonOf().get(0).getOrderNo());
if (season.isPresent())
return season.get();
return null;
}
@Named("epNumber")
default Integer mapEpNumber(Program programInstance) {
Optional<Integer> epNumber = Utils.getObject(() -> programInstance.getEpOf().get(0).getOrderNo());
if (epNumber.isPresent())
return epNumber.get();
return null;
}
MapStruct 具有预定义的尝试顺序:
- 用户提供的映射方法
- 直接(源-目标类型相同)
- 映射方法(内置)
- 类型转换
如果这一切都失败了,MapStruct 会尝试执行许多两步方法:
- 映射方法-映射方法
- 映射方式-类型转换
- 类型转换-映射方法
在 6. 它找到 2 个符合条件的方法(Program
到 String
)。这可能是 MapStruct 中的一个错误,它选择了 @Named
不合格的方法(需要检查这是否是故意的)。不然我写个issue
最简单的解决方案是:调整目标:
public class IvpVodOfferStatusDTO {
private Integer seasonNumber;
private Integer episodeNumber;
}
可能是您想要的(我猜)..否则您可以将签名更改为 return Integer
而是 String
我遇到了同样的问题并观察到,我的映射器 class 使用 @Mapper(uses = {BaseMapper.class}) 并使用 extends BaseMapper 继承了相同的方法。
删除扩展为我解决了这个问题。
因此,您可以通过多种方式查找自定义映射器接收到的方法。
我正在使用 mapstruct 从一个 DTO 映射到另一个。我有多个默认方法,但其中 2 个具有 return String 值并且使用相同的 class 作为输入参数给我 "Ambiguous mapping methods using java Mapstruct" 错误。我在这里添加代码的相关部分:
@Mappings({
@Mapping(source = "programInstance", target = "title", qualifiedByName = "title"),
@Mapping(source = "programInstance", target = "seriesName", qualifiedByName = "seriesName"),
@Mapping(source = "programInstance", target = "season", qualifiedByName = "season"),
@Mapping(source = "programInstance", target = "epNumber", qualifiedByName = "epNumber"),
})
DTO1 mapDTOs (DTO2 dto2);
@Named("title")
default String mapTitle(Program programInstance) {
Optional<String> title = Utils.getObject(() -> programInstance.getTitle().getDescriptions().get(0).getValue());
if (title.isPresent())
return title.get();
return null;
}
@Named("seriesName")
default String mapSeriesName(Program programInstance) {
Optional<String> seriesName = Utils.getObject(() -> programInstance.get(0).getProgram().getTitle().getDescriptions().get(0).getValue());
if (seriesName.isPresent())
return seriesName.get();
return null;
}
@Named("season")
default Integer mapSeasonNumber(Program programInstance) {
Optional<Integer> season = Utils.getObject(() -> programInstance.get(0).getSeasonOf().get(0).getOrderNo());
if (season.isPresent())
return season.get();
return null;
}
@Named("epNumber")
default Integer mapEpNumber(Program programInstance) {
Optional<Integer> epNumber = Utils.getObject(() -> programInstance.getEpOf().get(0).getOrderNo());
if (epNumber.isPresent())
return epNumber.get();
return null;
}
错误是
Ambiguous mapping methods found for mapping property "Program programInstance" to java.lang.String: java.lang.String mapTitle(), java.lang.String mapSeriesName().
我检查了你的例子。问题是你尝试定位的字段是字符串类型。
所以:
public class IvpVodOfferStatusDTO {
private String seasonNumber;
private String episodeNumber;
}
MapStruct 尝试将其与您提供的签名相匹配:
@Named("season")
default Integer mapSeasonNumber(Program programInstance) {
Optional<Integer> season = Utils.getObject(() -> programInstance.get(0).getSeasonOf().get(0).getOrderNo());
if (season.isPresent())
return season.get();
return null;
}
@Named("epNumber")
default Integer mapEpNumber(Program programInstance) {
Optional<Integer> epNumber = Utils.getObject(() -> programInstance.getEpOf().get(0).getOrderNo());
if (epNumber.isPresent())
return epNumber.get();
return null;
}
MapStruct 具有预定义的尝试顺序:
- 用户提供的映射方法
- 直接(源-目标类型相同)
- 映射方法(内置)
- 类型转换
如果这一切都失败了,MapStruct 会尝试执行许多两步方法:
- 映射方法-映射方法
- 映射方式-类型转换
- 类型转换-映射方法
在 6. 它找到 2 个符合条件的方法(Program
到 String
)。这可能是 MapStruct 中的一个错误,它选择了 @Named
不合格的方法(需要检查这是否是故意的)。不然我写个issue
最简单的解决方案是:调整目标:
public class IvpVodOfferStatusDTO {
private Integer seasonNumber;
private Integer episodeNumber;
}
可能是您想要的(我猜)..否则您可以将签名更改为 return Integer
而是 String
我遇到了同样的问题并观察到,我的映射器 class 使用 @Mapper(uses = {BaseMapper.class}) 并使用 extends BaseMapper 继承了相同的方法。 删除扩展为我解决了这个问题。 因此,您可以通过多种方式查找自定义映射器接收到的方法。