0

使用 mapstruct v1.0.0.Final,我面临一个模棱两可的映射异常,试图从SourceTypeto映射TargetType

class TargetType {
  List<TargetTypeChild> children;
  boolean allResults;
}

class SourceType {
  List<SourceTypeChild> children;
  boolean allResults;
}

我正在使用的映射是:

@Mapper(uses = B.class)
interface A {
    @Mapping(target = "children", source = "children", qualifiedBy = ToTargetType.class)
    TargetType toTargetType (SourceType source);

    @Mapping(target = "children", source = "children", qualifiedBy = ToTargetTypeNoDetails.class)
    TargetType toTargetTypeNoDetails (SourceType source);
}

interface B {
    @Qualifier
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface ToTargetType {}

    @Qualifier
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface ToTargetTypeNoDetails {}

    @ToTargetType
    @IterableMapping(qualifiedBy = ToTargetType.class)
    List<TargetTypeChild> withDetails(List<SourceTypeChild> value);

    @ToTargetTypeNoDetails
    @IterableMapping(qualifiedBy = ToTargetTypeNoDetails.class)
    List<TargetTypeChild> noDetails(List<SourceTypeChild> value);

    @ToTargetType
    @Mappings({ 
      @Mapping(target = "details", source = "details"), 
      ...rest of mapping 
    })
    TargetTypeChild toTargetTypeChild(SourceTypeChild source);

    @ToTargetTypeNoDetails
    @Mappings({ 
      @Mapping(target = "details", ignore = true), 
      ...rest of mapping 
    })
    TargetTypeChild toTargetTypeChildNoDetails(SourceTypeChild source);
}

这不会编译,在两个接口 A 的方法中都会出现以下异常:

发现将属性“List children”映射到 List 的不明确映射方法:List noDetails(List arg0)、List withDetails(List arg0)。

有一种解决方法:将接口 A 的两个方法都放在接口 B 中。这样可以编译并且可以工作。但出于商业原因,我需要将它们分开。

谁能解释为什么第一种方法不起作用而解决方法起作用?

作为一个额外的问题,如果我只编写 1 种映射方法(没有限定符),我什至不需要声明该@IterableMapping方法,mapstruct 知道如何找到“子”方法。为什么?

谢谢你们!

4

1 回答 1

2

任何人都可以解释为什么第一种方法不起作用而解决方法起作用?

您的限定符注释必须至少具有保留策略CLASS,只有这样它们才会被发现。如果所有内容都在同一个源文件中定义,则不需要这样做,在这种情况下SOURCE就足够了。

作为一个额外的问题,如果我只编写 1 种映射方法(没有限定符)

MapStruct 将根据需要生成(私有)可迭代映射方法。实际上它也应该在你原来的情况下工作,似乎这是我们需要修复的一个小故障。我已经为此提交了问题#707

感谢您报告此事!

于 2015-12-11T22:03:21.360 回答