2016-05-12 9 views
1

私はいくつかのRESTサービスにJPAとOlingoを使用しています。私はここの例に似たエンティティでの基本的な実装を得ることができました:JPA Olingo Web AppOlingoと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(); 
+1

その後、優れていると思いますクエリも。クロスデータベースのサポートが不要で、DBがクエリー変換をサポートしていれば、ネイティブの行レベルのセキュリティが優れています(Oracel、MS SQL、PostgreSQL、DB2がサポートしています) – jbaliuka

答えて

0

あなたはSTILそれに取り組んでいる場合、私は知りません。 私は今この問題に取り組んでいます。 Olingoは、ODataJPAQueryExtensionEntityListenerを提供します。このリスナーは、buildQueryの実行前にJPAQueryBuilderによって実行されます。

このステートレス・リスナーを使用すると、JPQL問合せを含む文字列jpqlStatement.toString()にアクセスして変更できるように、buildQueryメソッドを置き換えることができます。

私はあまりにも、同様の問題に取り組んでいますが、私は、私はDMLを確保し、ネイティブことができるようにSQLを解析し、変換するためにJDBCラッパーを使用するつもりですネイティブSQL

さようなら ドメニコ

関連する問題