Jerseyでリソースメソッドをトランザクション境界にする

ちょろっと話題に出たので簡単にまとめました。

やりたいこと

リソースメソッドをトランザクション境界にしたい。

話題に出た方法

ContainerRequestFilterContainerResponseFilter を使って実現できないかなー、という話が出ましたが私は無理だと思っています。

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を使うことで何とかなる