👚
Jerseyでリソースメソッドをトランザクション境界にする
ちょろっと話題に出たので簡単にまとめました。
やりたいこと
リソースメソッドをトランザクション境界にしたい。
話題に出た方法
ContainerRequestFilterやContainerResponseFilterを使って実現できないかなー、という話が出ましたが私は無理だと思っています。
ContainerRequestFilter
はリソースメソッドの前に実行されるだけ、ContainerResponseFilter
はリソースメソッドの後に実行されるだけでtry-catch-finally
ができないからです。
パッと思いつく方法
GlasFishなどJava EE 7準拠のアプリケーションサーバで動かすのであればリソースクラスをCDI管理ビーンにして@Transactionalで注釈すればそれだけでリソースメソッドがトランザクション境界になります。
Tomcat + Jerseyぐらいの構成で実現する方法
CDI使ってない、っていうかTomcatで動かしてる、つーかDIコンテナ使ってない!!!という場合はどうすれば良いのか?
Jerseyは内部的にHK2というDIコンテナを使っています。
このHK2のAOP機能を利用してリソースクラスにインテーセプターを適用してリソースメソッドをトランザクション境界にする方法が取れます。
ザクッとサンプル書いてみたので詳細はコードを読んでください。
まとめ
- JAX-RSの仕様ではサーブレットフィルタのような
try-catch-finally
ができるポイントが無い - CDIを併用すれば何とでもなる
- Jerseyなら実装に依存するけどHK2を使うことで何とかなる
Discussion