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

我正在使用 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;

}

错误是


发现用于将属性“Program programInstance”映射到 java.lang.String 的不明确映射方法:java.lang.String mapTitle()、java.lang.String mapSeriesName()。


噜噜哒
浏览 228回答 2
2回答

天涯尽头无女友

我检查了您的示例。问题是您尝试定位的字段是字符串类型。所以:public class IvpVodOfferStatusDTO {&nbsp; &nbsp; private String seasonNumber;&nbsp; &nbsp; private String episodeNumber;}&nbsp;MapStruct 尝试将其与您提供的签名匹配:&nbsp;@Named("season")default Integer mapSeasonNumber(Program programInstance) {&nbsp; &nbsp; Optional<Integer> season = Utils.getObject(() -> programInstance.get(0).getSeasonOf().get(0).getOrderNo());&nbsp; &nbsp; if (season.isPresent())&nbsp; &nbsp; &nbsp; &nbsp; return season.get();&nbsp; &nbsp; return null;}@Named("epNumber")default Integer mapEpNumber(Program programInstance) {&nbsp; &nbsp; Optional<Integer> epNumber = Utils.getObject(() -> programInstance.getEpOf().get(0).getOrderNo());&nbsp; &nbsp; if (epNumber.isPresent())&nbsp; &nbsp; &nbsp; &nbsp; return epNumber.get();&nbsp; &nbsp; return null;}MapStruct 有一个预定义的尝试顺序:用户提供的映射方法直接(源-目标类型相同)映射方法(内置)类型转换如果这一切都失败了,MapStruct 会尝试执行一些 2 步方法:映射方法 - 映射方法映射方法——类型转换类型转换-映射方法在 6. 它找到了 2 个限定方法 (&nbsp;Programto&nbsp;String)。这可能是 MapStruct 中的一个错误,它选择了不符合条件的方法(需要检查这是否是故意的)@Named。否则,我会写一个问题。最简单的解决方案是:调整目标:public class IvpVodOfferStatusDTO {&nbsp; &nbsp; private Integer seasonNumber;&nbsp; &nbsp; private Integer episodeNumber;}什么可能是你想要的(我猜).. 否则你可以改变签名不返回一个Integer但String

四季花海

我遇到了同样的问题并观察到,我的映射器类使用 @Mapper(uses = {BaseMapper.class}) 并使用扩展 BaseMapper 继承了相同的方法。删除扩展为我解决了这个问题。因此,您可以通过多种方式查找自定义映射器接收到的方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java