2017-11-02 12 views
0

MapStructが(FetchType.LAZYとして指定されていても)オブジェクト内のすべてのJPA参照を読み込む問題を回避しようとしています。Mapstructで生成されたマッピングにフィルタ関数を適用する

私は、それぞれのメソッドに対して「呼び出される」メソッドを追加しました。ただし、呼び出されたいメソッドは「使用済み」マッパーのゲッターです。 作成したメソッド次のようにトップレベルのマッパーインタフェースクラスである:私は使用していますマッピング方法のために、次のように

​​

と生成されたコードは次のとおりです。

customerOrderDto.setStartDate(checkIt(customerOrder.getStartDate())); 
customerOrderDto.setEndDate(checkIt(customerOrder.getEndDate())); 
customerOrderDto.setCustomer(customerDtoMapper.toDto(customerOrder.getCustomer())); 
customerOrderDto.setTopology(topologyDtoMapper.toDto(customerOrder.getTopology())); 

をあなたが見ることができるように、それがためにそれを生成し、最初の2つ(開始日付&)b他の2つのユーザ(顧客&トポロジ)は、独自のマッパが定義されていて(このマッパによって使用されています)、それを呼び出すことはありません。

MapStructに「取得」する各メソッドでこれを呼び出す方法はありますか?

各.get()メソッドをラップすることができれば、エンティティがまだロードされているかどうかをチェックし、@JsonViewビューマッピングを使用してフィルタリングする可能性があります。

答えて

0

まず、MapStructはJPA参照をロードしません。 MapStructは、マッピングを実行するために使用するJavaコードを生成するアノテーションプロセッサツールです。

checkItメソッドは、マッピングを実行するために使用できるより具体的な方法(customerDtoMapperおよびtopologyDtoMapper)が使用されているため、使用されていません。その上に、MapStructはマッピングを他のメソッドに渡すときにマッピングを実行しません。あなたのメソッドは、同じソースとターゲットの型をマッピングする場合にも機能します。

しかし、customerDtoMappertopologyDtoMapperなど、他のマッパーで必要なチェックを行うことができます。

新しい@Contextの可能性と@BeforeMappingのメソッドを使用して、null以外の値を返します(メソッドからすぐに返されます)。 @Contextを使用して、確認が必要かどうかをcustomerDtoMapperで確認することができます。

checkItの方法を@BeforeMappingMethodにすることができます。ただし、渡されたソースではなく、何らかのDTOを返そうとしているので、署名を変更する必要があります。

+0

返信いただきありがとうございます。私はMapStructがJPA参照をロードしないことを認識しています、それは私の特定のユースケースを定義することだけでした。その時点で他のマッパーにチェックを追加することはできません。 "getCustomer()"メソッドを呼び出す行為はすでにJavassistプロキシを呼び出してデータベースからエントリを読み込み、これを理解することからも@BeforeMappingオプションも除外してください。実際には何が実際に生成されるのかは、「toDto(myFunc(oDest、fDest、() - > customerOrder.getCustomer()))」というようになるでしょう。 –

+0

...目的地フィールドを確認して、JsonViewアノテーションがあるかどうかを確認し、渡されたコンテキスト(現在MapStructで持っている別の問題)に基づいてフィルタリングすることもできます。myFuncはmyFunc(Object oDest、Field fDest、Callable ゲッター)として定義する必要があります。(a)Javassistプロキシが初期化されているかどうかを確認し、そうでなければnullを返します(JPAユースケース1)。 JsonViewアノテーションの目的地フィールドと、必要なビュー(JsonViewユースケース2)のセットに含まれていない場合はnullを返します。 –

+0

...オブジェクトが返されるようにしたい場合は、 "return getter.call(); " MapStructのコードベースが大きいので、誰かが私が変更を行うためにどこに向いているのかを教えてもらえると助けになるかもしれません。ありがとう。 –

関連する問題