18

特定のオブジェクトを mapstruct でマップするには、追加のパラメーターを必要とするカスタムの後処理が必要です。

@Mapper
public abstract class AlertConfigActionMapper {

    @Mappings({ @Mapping(target = "label", ignore = true)})
    public abstract AlertConfigActionTO map (AlertConfigAction action, Locale userLanguage);

    @AfterMapping
    public void setLabel (AlertConfigAction  action, @MappingTarget AlertConfigActionTO to, Locale userLanguage) {
        for (AlertConfigActionLabel label : action.getAlertConfigActionLabels()) {
            if (label.getLanguage().equals(userLanguage)) {
                to.setLabel(label.getLabel());
                break;
            } else if (label.getLanguage().equals(Locale.ENGLISH)) {
                to.setLabel(label.getLabel());
            }
        }

    }
}

これはうまくいきます。このマッパーに次のメソッドを追加すると、問題が発生します。

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

このパラメーター (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メソッドが正しく生成されるため、パラメーターに関連していると確信しています。

この場合、カスタム パラメータを許可するにはどうすればよいですか?

4

3 に答える 3

8

あなたが説明することは(まだ)不可能です。イシュー トラッカーで機能リクエストを送信していただけますか? コールスタックに渡されるある種の「コンテキスト」としてパラメーターを示す手段を提供する必要があります。

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

于 2016-05-10T08:27:35.783 に答える
1

私はそれが可能だとは思わない。少なくともそうではありません。問題は、インターフェイス/抽象クラスを準備することです-残りはエンジンによって行われます。そして、そのエンジンは 1 つのパラメーターを持つメソッドを想定しています... デコレーターはありますが、同じように動作します。私は言語を注入しようとします。Bean を作成し、それをセッション スコープとしてマークし、調べます。Spring では、そのために ScopedProxyMode を使用します... CDI でどうなるかわかりません。

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

于 2016-05-09T17:50:04.480 に答える