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

Spring Bootキャンプをやった #kanjava_sbc

@making さんを講師にお迎えしてSpring Bootを土台にしてプログラミングを楽しむハンズオンを開催しました。

会場は楽天株式会社大阪支社のカフェテリアをお借り致しました。 @bufferings さん、ご協力ありがとうございました。

今回のハンズオンではカメラで撮った写真をSpring MVCに投げてOpenCVで画像変換をしました。 変換部分はJMSで非同期処理しクライアントとサーバー間はSTOMPというプロトコルをWebSocket上で利用して通信しました。

Spring Bootの関係無さ感すごい!!!

しかし、このように色々な技術を使ったWebサービスのハンズオンを特にややこしい設定もせず 約2時間半で進める事ができたのはいろいろと自動で設定を宜しくやってくれるSpring Bootがあってこそだと思いました。

楽しいハンズオンを行って頂いて@makingさんには本当に感謝です!!!

ハンズオンの様子

ちなみに

東京でも開催されるっぽいですよ!

おまけ

Spring Boot + Jersey。 懇親会で話題に出たやつです。 前にちょこっとやりました。