web-dev-qa-db-ja.com

JAX-RSを使用したトランザクションとサブリソース

既存のアプリケーションRESTful APIをJava= Webフレームワークに移植しています-実際にはどちらでもかまいません-しかし、基本を正しく理解するのは困難です。

問題の核心は、トランザクションが機能するようにJAX-RSとデータベースの間のブリッジを取得することであるように思われます。 APIはサブリソースを多く使用します。JAX-RSが機能するように見える方法には、新しいロケーターを返すことが含まれます。これは素晴らしいパターンですが、トランザクションを効果的に制限する場所がないことを意味するため、@ Transactionalアノテーションが問題になります。どういうわけか、それらをリクエストにスコープすることを本当に望んでいますが、私が試したフレームワークのどれも、それを簡単に、あるいは可能にすることさえできないようです。

それは一種の三体問題です。トランザクションとクエリをリポジトリレイヤーにプッシュすることで問題なく実行できますが、サブリソースを使用する必要はありません。または、サブリソースやクエリを適切に実行することもできますが、トランザクションが発生するニースはありません。基本的に、トランザクション、サブリソース、および複雑なクエリのいずれか2つを使用できますが、3つすべてが必要です。

これまでのところ、私はこれをGuice + Jersey + Querydsl、およびSpring DataとSpring RESTで動作させるようにしてきました。これらはすべて、各エンドポイントを@Transactionalにすることができ、(通常は)テーブル上の単純なCRUDAPIであるという考えに完全に基づいているようです。とても素敵なフロントエンドがすでに構築されています。 Javaはサービスを構築するのに厄介なため、完全に書き直す理由はありません。

トランザクションを要求に結び付ける必要があることをどういうわけか知っており、とにかくDTOを使用するのでそれで満足ですが、それを実現する方法が見つかりません。誰かが役に立つポインタ、テンプレート、アドバイスを持っていますか?

2
Stuart Watt

JAX-RSが必須ではない場合は、 Restlet を確認することをお勧めします。コンベアアーキテクチャを使用しているため、リソースを他のリソースにネストすることは問題ではありません。 階層URI を参照してください。 Springと統合する の場合、通常はルート SpringBeanRouter を定義します。この場合、実際のリソースを配置し、それぞれに別のルーターを配置できます。

トップレベルのリクエストを定義するだけで、すべてのリソースのすべてのメソッドをラップできます filter これは、Springのトランザクションテンプレートなどを使用できます。または、ロケーターを返す必要がないため、(サブ)リソースのメソッドに@Transactionalアノテーションを付けるだけで済みます。

詳細については、 org.restlet.ext.spring パッケージを参照してください。

1
scriptin