使用帮助程序类时,mapstruct模糊异常

时间:2015-12-10 11:11:43

标签: mapstruct

使用mapstruct v1.0.0.Final ,我正面临一个模糊的映射异常,试图从SourceType映射到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知道如何找到“children”方法。 为什么呢?

谢谢大家!

1 个答案:

答案 0 :(得分:2)

  

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

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

  

作为奖励问题,如果我只编写1个映射方法(没有限定符)

MapStruct将根据需要生成(私有)可迭代映射方法。实际上它应该也适用于你的原始情况,似乎这是我们需要解决的一个小问题。我已为此提交了问题#707

感谢你报告这个!