为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

噜噜哒 2022-06-15 09:29:59
我正在使用 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()。
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

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


所以:


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 会尝试执行一些 2 步方法:

  1. 映射方法 - 映射方法

  2. 映射方法——类型转换

  3. 类型转换-映射方法

在 6. 它找到了 2 个限定方法 ( Programto String)。这可能是 MapStruct 中的一个错误,它选择了不符合条件的方法(需要检查这是否是故意的)@Named。否则,我会写一个问题。

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

public class IvpVodOfferStatusDTO {


    private Integer seasonNumber;

    private Integer episodeNumber;

}

什么可能是你想要的(我猜).. 否则你可以改变签名不返回一个Integer但String


查看完整回答
反对 回复 2022-06-15
?
四季花海

TA贡献1811条经验 获得超5个赞

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



查看完整回答
反对 回复 2022-06-15
  • 2 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信