Mapstruct-为映射属性找到模糊的映射方法

时间:2019-02-11 03:43:13

标签: java mapstruct

我正在使用mapstruct从一个DTO映射到另一个。我有多个默认方法,但是其中两个具有返回值String且使用与输入参数相同的类的默认方法给我“使用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;
}

错误是

  

找到了映射属性“程序”的歧义映射方法   programInstance”到java.lang.String:java.lang.String mapTitle(),   java.lang.String mapSeriesName()。

2 个答案:

答案 0 :(得分:1)

我检查了您的示例。问题是您尝试定位的字段的类型为String。

所以:

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. 直接(类型source -target相同)
  3. 映射方法(内置)
  4. 类型转换

如果这一切都失败了,MapStruct会尝试采取许多2步方法:

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

在6,它找到2种合格方法(ProgramString)。在MapStruct中,它选择的@Named不符合要求(需要检查是否是故意的)的方法可能是错误的。否则,我会写一个问题。

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

公共类IvpVodOfferStatusDTO {

private Integer seasonNumber;
private Integer episodeNumber;

}

您可能打算做什么(我想)。否则,您可以更改签名而不是返回Integer而是返回String

答案 1 :(得分:0)

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