gpt4 book ai didi

java - Mapstruct - 为映射属性找到的映射方法不明确

转载 作者:搜寻专家 更新时间:2023-11-01 03:15:36 24 4
gpt4 key购买 nike

我正在使用 mapstruct 从一个 DTO 映射到另一个。我有多个默认方法,但其中有 2 个返回值是 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;
}

错误是

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 不合格的方法(需要检查这是否是故意的)。否则,我会写一个问题。

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

public class IvpVodOfferStatusDTO {

private Integer seasonNumber;
private Integer episodeNumber;
}

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

关于java - Mapstruct - 为映射属性找到的映射方法不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54623673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com