私はいくつかのRESTサービスにJPAとOlingoを使用しています。私はここの例に似たエンティティでの基本的な実装を得ることができました:JPA Olingo Web App。OlingoとJPAを使用した認証
しかし、ここで私はテーブルにアクセスし、それに応じて結果をフィルタリングするために参加する認可を追加しようとしています。私はちょうどそこにデフォルトの動作をオーバーライドすることなくこれを行うための良い方法があるのだろうかと思っています。私はここで注釈プロセッサーを見たことがあるAnnotation Processor EDMのためにそれは私達のモデルに非常によく合うように思わない。
私の質問は次のとおりです。認証を実装するためにOlingo JPAプロセッサをデフォルトでテーブルとフィルタエンティティを結合するように変更する簡単な方法はありますか?これにより、フィルタリングするためのアカウントを渡すことができ、すべての結果を制限する必要があります。
私はまた、ここで説明するように前処理と後処理を試みました。 Custom JPA Processorしかし、JPAクエリでは結果が多すぎるため、結果が返された後ではなく、何千ものオブジェクトを変換するのに時間がかかり、コストがかかるため、フィルタリングをクエリで実行する必要があります。
これまでのところ、私はCustomODataJPAPProcessorを実装しました。ただし、org.apache.olingo.odata2.jpa.processor.core.access.data.JPAProcessorImpl#processメソッドを書き換えて上書きし、JPAクエリを自分の望む機能で変更する必要があります。プロセスを呼び出して自分のアカウントに送信する新しいJPAProcessorを実装したことがわかります。ここに私のコードは私のCustomODataJPAProcessorのreadEntitySet方法で次のようになります。
/* Pre Process Step */
preprocess();
List<String> accounts = new ArrayList<>();
//This is what the original readEntitySet does
//ODataJPAFactory.createFactory().getODataJPAAccessFactory().getODataJPAResponseBuilder(oDataJPAContext);
//Using custom JPA Processor that I added
jpaProcessor = new CustomJPAProcessor(this.oDataJPAContext);
CustomJPAProcessor customJPAProcessor = (CustomJPAProcessor)jpaProcessor;
List<Object> jpaEntities = customJPAProcessor.process(uriParserResultView, accounts);
//What the docs want you to do http://olingo.apache.org/doc/odata2/tutorials/CustomODataJPAProcessor.html
//java.util.List<Object> jpaEntities = jpaProcessor.process(uriParserResultView);
/* Post Process Step */
postProcess();
その後、優れていると思いますクエリも。クロスデータベースのサポートが不要で、DBがクエリー変換をサポートしていれば、ネイティブの行レベルのセキュリティが優れています(Oracel、MS SQL、PostgreSQL、DB2がサポートしています) – jbaliuka