2016-04-04 4 views
14

でパラメータを指定して、コレクションの地図私はそれが仕事だ行うための追加のパラメータを必要とするいくつかのカスタム後処理を必要としています。私はこのマッパーに次のメソッドを追加するとき 問題が開始されます。mapstructと特定のオブジェクトをマップするにはmapstruct

public abstract ArrayList<AlertConfigActionTO> mapList (List<AlertConfigAction> actions, Locale userLanguage); 

私もこのパラメータ(ユーザーの言語)に合格する必要がありますが、この場合には「打破」にmapstructようだ:私はこの部分のために以下のコードを生成します(自然にコンパイルエラーを与える):

@Override 
public List<AlertConfigActionTO> mapList(List<AlertConfigAction> actions, Locale userLanguage) { 
    if (actions == null && userLanguage == null) { 
     return null; 
    } 

    List<AlertConfigActionTO> list = new List<AlertConfigActionTO>(); 

    return list; 
} 

私は(すべてのマッピング方法から)それを削除した場合、その後mapListメソッドが正しく生成されているので、それがパラメータに関連していると確信しています。

この場合カスタムパラメータを許可するために必要なことはありますか?

答えて

7

あなたの説明はできません(まだ)。機能リクエストはissue trackerで開けますか?コールスタックに渡される何らかの「コンテキスト」としてパラメータを示す手段を提供する必要があります。

当面の回避策として、ThreadLocalを使用して、マッピングルーチンを呼び出す前に設定し、マッピング後のカスタマイズでアクセスすることがあります。それはエレガントではない - あなたはメモリリークを避けるためにローカルスレッドをきれいにする必要がありますが、それはトリックを行う必要があります。

+0

ありがとう、作成済みhttps://github.com/mapstruct/mapstruct/issues/809 –

+0

FYI:実際のマッパーのラッパーとしてファサードを作成していたので(コードを実際のマッパー実装からさらに分離するため)私は、個々の項目のリスト(AlertConfigAction)をループし、個別にマップします。この機能がサポートされるたびに、ファサードを更新することができます。 –

1

私は考えられません。少なくともそのようにはならない。問題はあなたがインターフェイス/抽象クラスを準備することであり、残りはエンジンによって行われます。そしてそのエンジンは一つのパラメータでメソッドを期待しています...デコレータもありますが、同じ方法です。私は言語を注入しようとします。 Beanを作成し、それをセッション範囲としてマークし、見つけます。 Springでは、そのためにScopedProxyModeを使用します...そのことがCDIとどのように関係するかはわかりません。

他のオプションは、より回避策です、解決策 - おそらくAlertConfigActionはその情報を渡すことができますか?

関連する問題