0

mapstruct v1.0.0.FinalSourceTypeを使用して、からにマップしようとしているあいまいなマッピング例外に直面しています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)。

これには 1 つの回避策があります。インターフェイス A の両方のメソッドをインターフェイス B に配置します。これはコンパイルされ、機能します。しかし、ビジネス上の理由から、それらを分離する必要があります。

最初のアプローチが機能せず、回避策が機能する理由を誰かが説明できますか?

おまけの質問として、マッピング用のメソッドを 1 つだけコーディングする (修飾子なし) 場合、@IterableMappingメソッドを宣言する必要さえありません。mapstruct は「子」メソッドを見つける方法を知っています。なんで?

皆さん、ありがとうございました!

4

1 に答える 1