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ビューマッピングを使用してフィルタリングする可能性があります。
返信いただきありがとうございます。私はMapStructがJPA参照をロードしないことを認識しています、それは私の特定のユースケースを定義することだけでした。その時点で他のマッパーにチェックを追加することはできません。 "getCustomer()"メソッドを呼び出す行為はすでにJavassistプロキシを呼び出してデータベースからエントリを読み込み、これを理解することからも@BeforeMappingオプションも除外してください。実際には何が実際に生成されるのかは、「toDto(myFunc(oDest、fDest、() - > customerOrder.getCustomer()))」というようになるでしょう。 –
...目的地フィールドを確認して、JsonViewアノテーションがあるかどうかを確認し、渡されたコンテキスト(現在MapStructで持っている別の問題)に基づいてフィルタリングすることもできます。myFuncはmyFunc(Object oDest、Field fDest、Callableゲッター)として定義する必要があります。(a)Javassistプロキシが初期化されているかどうかを確認し、そうでなければnullを返します(JPAユースケース1)。 JsonViewアノテーションの目的地フィールドと、必要なビュー(JsonViewユースケース2)のセットに含まれていない場合はnullを返します。 –
...オブジェクトが返されるようにしたい場合は、 "return getter.call(); " MapStructのコードベースが大きいので、誰かが私が変更を行うためにどこに向いているのかを教えてもらえると助けになるかもしれません。ありがとう。 –