2017-02-01 14 views
0

抽象クラスを使用してMapStructに問題があります。 私は2つのマッパーを持っている:MapStruct:抽象クラスの問題

MapperA extends AbstractMapper<U,V> 
MapperB extends AbstractMapper<U,V> 

MapperA iはあいまいなメソッドエラーを得た、私はクリーンインストールしている間

public <T extends AbstractReference> T resolveReference(String id, @TargetType Class<T> entityClass) { 
    // Some implementation 
} 

AbstractMapper方法を持っているMapperB

を使用しています。

Mapstructは、同じクラスを拡張する各Mapperのメソッドを2回見つけているようです。

修飾子に関する検索はいくつか行いましたが、同じシグネチャで異なるメソッドを使用すると便利です。しかし、私の場合、それは同じものです!

intがある場合。

おかげ

編集:

@Mapper(componentModel = "cdi", uses = {MapperB.class}) 
    @ApplicationScoped 
    public abstract class MapperA extends AbstractMapper<U1,V1> {} 

MapperBは、他のマッパーを使用していません。

@Mapper(componentModel = "cdi") 
    @ApplicationScoped 
    public abstract class MapperB extends AbstractMapper<U2,V2> {} 
+0

は、あなたのマッパーを使用して示してできます定義?あなたはMapperBでMapperAを使っているのでしょうか反対ですか? – Filip

+0

@ Mapper(componentModel = "cdi"、uses = {MapperB.class}) @ApplicationScoped public abstract class MapperAはAbstractMapperを拡張します {} MapperBは他のマッパーを使用しません。 – teyma

+0

マッパーで宣言された型パラメータがあるのはなぜですか?それらはどこで使用されていますか? – Gunnar

答えて

1

実際には1つの方法はありません。2つの方法があります。 1つはMapperA、もう1つはMapperBです。 MapStructは、継承と各メソッドの場所については気にしません。

また、あなたの方法

public <T extends AbstractReference> T resolveReference(String id, @TargetType Class<T> entityClass) { 
    // Some implementation 
} 

は同じ消去を持ち、MapStructであいまいなメソッドエラーにつながるAbstractMapper汎用パラメータに依存しない汎用的なものです。

私はあなたが実際にこのメソッドでやっていることはわかりません。しかし、AbstractMapper汎用パラメータUVに依存しない一般的なものであれば、このメソッドを別のクラスに抽出し、そのクラスをuses注釈変数に追加することをお勧めします。

方法はパラメータに依存している場合、彼らはそれの一部であることを確認してください彼らは、コンパイル時に異なるタイプ(U1, V1またはU2, V2)を持っていると同じように、その後、MapStructが正常に動作しますが

+0

私はあなたが書くと思う、私は使用する注釈で別のクラスを使用する必要があります(それをMapperUtilと呼ぶことができます)。しかし、MapperAとMapperBがMapperUtilクラスを使用する場合、問題は同じままになりますが、このメソッドは引き続き2回表示されます。 – teyma

+0

いいえ、MapperUtillクラスを使用すると、MapStructは同じクラスからのものであることを認識し、問題にはなりません。あなたの質問にも@gunnarからのコメントを参照してください。'resolveReference'で型を使うと、それもうまくいくはずです。 – Filip

+0

答えをありがとう、それはMapperUtilクラスで動作します:) – teyma