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 具有预定义的尝试顺序:

  1. 用户提供的映射方法
  2. 直接(源-目标类型相同)
  3. 映射方法(内置)
  4. 类型转换

如果这一切都失败了,MapStruct 会尝试执行许多两步方法:

  1. 映射方法-映射方法
  2. 映射方式-类型转换
  3. 类型转换-映射方法

在 6. 它找到 2 个符合条件的方法(ProgramString)。这可能是 MapStruct 中的一个错误,它选择了 @Named 不合格的方法(需要检查这是否是故意的)。不然我写个issue

最简单的解决方案是:调整目标:

public class IvpVodOfferStatusDTO {

    private Integer seasonNumber;
    private Integer episodeNumber;
}

可能是您想要的(我猜)..否则您可以将签名更改为 return Integer 而是 String

我遇到了同样的问题并观察到,我的映射器 class 使用 @Mapper(uses = {BaseMapper.class}) 并使用 extends BaseMapper 继承了相同的方法。 删除扩展为我解决了这个问题。 因此,您可以通过多种方式查找自定义映射器接收到的方法。