我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
错误是
找到了用于将属性“ Program programInstance”映射到java.lang.String的模糊映射方法:java.lang.String mapTitle(),java.lang.String mapSeriesName()。
我检查了您的示例。问题是您尝试定位的字段是字符串类型。
所以:
public class IvpVodOfferStatusDTO {
private String seasonNumber;
private String episodeNumber;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
MapStruct 具有预定义的尝试顺序:
如果这一切都失败了 MapStruct 会尝试执行许多 2 步方法:
At 6. it finds 2 qualifying methods (Program to String). It's probably an error in MapStruct that it selects methods that do not qualify (need to check whether this is intentional) by the @Named. Otherwise, I'll write an issue.
The most easy solution is: adapt the target:
public class IvpVodOfferStatusDTO {
private Integer seasonNumber;
private Integer episodeNumber;
}
Run Code Online (Sandbox Code Playgroud)
What is probably what you intend (I guess).. Otherwise you could change the signature not to return an Integer but a String