内容が分かりづらかったらすみません。
現在payara41(glassfish) + Java EE7の環境でwebApiサービスの開発をしており、
ORマッパーにJPA、トランザクション管理にJTAを使用しています。
トランザクションを使うときは@Transactionalアノテーションを利用してコンテナ側で管理しているのですが
メソッド内でランタイム例外が発生したときになぜかjavax.transaction.RollbackExceptionがスローされて本来のランタイム例外が消えてしまいます。
@transactional境界内で例外が起きた場合はロールバックはされますが、例外はそのまま帰ってくるのが正しい挙動だと思うのです。
[サンプル]
java
1@Transactional 2public String hoge() { 3 4 UserEntity user = new UserEntity(); 5 6 // userエンティティを登録 7 em.persist(user); 8 9 // ここでランタイム例外がスローされる 10 throw new WebApplicationException("error") 11 12 return "ok"; 13}
↓エラーログ(WebApplicationExceptionが消える)
java
12018-01-25T10:32:50.113+0900|情報: About to setRollbackOnly from @Transactional interceptor on transaction: JavaEETransactionImpl: txId=1 nonXAResource=null jtsTx=null localTxStatus=4 syncs=[org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper$1@7c9e0aec, org.eclipse.persistence.transaction.JTASynchronizationListener@7dbc058c] 22018-01-25T10:32:50.114+0900|情報: Managed bean with Transactional annotation and TxType of REQUIRED encountered exception during commit {0} 3javax.transaction.RollbackException: Transaction marked for rollback. 4 at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:445) 5 at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:854) 6 at com.sun.enterprise.transaction.TransactionManagerHelper.commit(TransactionManagerHelper.java:81) 7 at org.glassfish.cdi.transaction.TransactionalInterceptorRequired.transactional(TransactionalInterceptorRequired.java:97) 8...長いので略
webで情報を調べたところ、この問題はglassfish4.0ですでに検知されていて
修正もされた?と言われていました。
ですが使用しているのは最新バージョン(4.1.2)ですがこの問題が起きています。
http://n-agetsuma.hatenablog.com/entry/2014/12/25/000638
http://masatoshitada.hatenadiary.jp/entry/2015/10/25/104908
例外発生時にExceptionMapperで独自のレスポンスを生成しているのですがこの謎挙動に悩まされています。。
この事象について解決策のわかる方いらっしゃいますでしょうか。
wildFlyなど他のEEサーバを利用するしかないのでしょうか。
回答1件
あなたの回答
tips
プレビュー