👚

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

2015/03/09に公開

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

やりたいこと

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

話題に出た方法

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

ContainerRequestFilterはリソースメソッドの前に実行されるだけ、ContainerResponseFilterはリソースメソッドの後に実行されるだけでtry-catch-finallyができないからです。

パッと思いつく方法

GlasFishなどJava EE 7準拠のアプリケーションサーバで動かすのであればリソースクラスをCDI管理ビーンにして@Transactionalで注釈すればそれだけでリソースメソッドがトランザクション境界になります。

Tomcat + Jerseyぐらいの構成で実現する方法

CDI使ってない、っていうかTomcatで動かしてる、つーかDIコンテナ使ってない!!!という場合はどうすれば良いのか?

Jerseyは内部的にHK2というDIコンテナを使っています。
このHK2のAOP機能を利用してリソースクラスにインテーセプターを適用してリソースメソッドをトランザクション境界にする方法が取れます。

ザクッとサンプル書いてみたので詳細はコードを読んでください。

https://github.com/backpaper0/jersey-interceptor-sample

まとめ

  • JAX-RSの仕様ではサーブレットフィルタのようなtry-catch-finallyができるポイントが無い
  • CDIを併用すれば何とでもなる
  • Jerseyなら実装に依存するけどHK2を使うことで何とかなる

Discussion