Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

@RequestMappingや@Pathを指定したメソッドを@Transactionalにするとエラー発生時にビジネスロジック個別のエラーを返せない

JavaにおけるREST APIの実装には、Spring RESTの@RequestMappingや、JAX-RSの@Pathを指定したメソッドが使える。同様に、Spring FrameworkRDBMSにアクセスする際は、@Transactionalでトランザクションの開始点を指定できる。@Transactionalを指定したメソッドから例外が返るとトランザクションロールバックされる。

ここで、トランザクションエラー発生時にビジネスロジック個別のオブジェクト(ブラウザからユーザ操作で指定してたオブジェクトとか)を返したいとする。ビジネスロジックの始点は@RequestMappingや@Pathを指定したメソッドになる。ここで、トランザクションロールバックしたければこのメソッドから例外を返さないといけない。一方で、ビジネスロジック個別のデータをAPIの呼び出し元に返したい場合、@RequestMappingや@Pathを指定したメソッドの中で使われているオブジェクトをreturnしないといけない。

……というわけで、どうやら@RequestMappingや@Pathと@Transactionalとを1つのメソッドに指定するのは実装上のアンチパターンのように見える。