堆栈跟踪javax.transaction.RollbackException缺少原因

时间:2013-03-14 07:08:37

标签: java exception-handling junit

我有一个带有javax.transaction.RollbackException的堆栈跟踪:

  

[...]引起:   ch.ethz.id.wai.lakshmi.engine.common.LakshmiException:错误   处理用户交易。在   ch.ethz.id.wai.lakshmi.engine.common.TransactionHelper.commitTransaction(TransactionHelper.java:79)   在   ch.ethz.id.wai.lakshmi.stdcmp.persistency.StandardPersistency.registerOrder(StandardPersistency.java:110)   引起:javax.transaction.RollbackException:标记为的事务   回滚。在   com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:473)   在   com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:855)   在   com.sun.enterprise.transaction.UserTransactionImpl.commit(UserTransactionImpl.java:208)   在   ch.ethz.id.wai.lakshmi.engine.common.TransactionHelper.commitTransaction(TransactionHelper.java:74)

     

在   org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)   在   org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)   在   org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1316)   在   org.hibernate.ejb.AbstractEntityManagerImpl $ CallbackExceptionMapperImpl.mapManagedFlushFailure(AbstractEntityManagerImpl.java:1510)   在   org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:109)   在   org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:53)   在   com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:435)

     

在   org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)   在   org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)   在   org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)   在   org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)   在   org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)   在com.sun.proxy。$ Proxy233.executeUpdate(未知来源)at   org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:56)   在   org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3028)   在   org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3469)   在   org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88)   在org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)   在   org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)   在   org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:275)   在   org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)   在   org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)   在org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)at   org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402)   在   org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:104)

     

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)at at   oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)at at   oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)at at   oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)at at   oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)at at   oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)at at   oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)   在   oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1008)   在   oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)   在   oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)   在   oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3530)   在   oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)   在   com.sun.gjc.spi.base.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:125)   在   org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)

RollbackException有一个我可以在调试时看到的原因:

  

javax.persistence.PersistenceException:   org.hibernate.exception.GenericJDBCException:ORA-22295:无法绑定   1个语句中超过4000字节的数据到LOB和LONG列

又由

引起
  

org.hibernate.exception.GenericJDBCException:ORA-22295:无法绑定   1个语句中超过4000字节的数据到LOB和LONG列

但是RollbackExeption的原因没有显示在堆栈跟踪中(这样可以简化错误的调试)。

知道原因吗?

修改

我在测试方法(JUnit)中添加了一个try-catch:

@Test
public void foo() throws Throwable {
    try {
        // test code generating the exception
} catch ( Exception e ) {
    // here the exception cause is still there
}

由于这个方法是由JUnit直接调用的,所以当它离开我的代码时异常仍然可以。

enter image description here

2 个答案:

答案 0 :(得分:0)

如果您希望在例外中显示原因,我想您唯一的机会是在Glassfish打开错误/改进请求。我查看了JavaEETransactionImpl的源代码,这是RollbackException被抛出的位置,而第473行代码是:

rbe = new RollbackException(sm.getString("enterprise_distributedtx.mark_rollback"));

正如您所看到的,我正在查看版本3.1.1,因此如果您有不同的版本,请查看正确的源代码(我怀疑它会有所不同)。

答案 1 :(得分:0)

问题是Ant错误地过滤了部分异常跟踪

来自Junit task documentation

  

filtertrace从错误和失败堆栈跟踪中筛选出Junit和Ant堆栈帧。

默认为on,但它不仅会过滤Junit和Ant帧:将其设置为关闭回滚原因。