【问题标题】:Stack trace of javax.transaction.RollbackException missing the causejavax.transaction.RollbackException 的堆栈跟踪缺少原因
【发布时间】:2013-03-02 10:39:03
【问题描述】:

我有一个带有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(Unknown Source) 在 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) 在 org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402) 在 org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:104)

在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439) 在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395) 在 oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802) 在 oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436) 在 oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) 在 oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521) 在 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 直接调用的,所以当它离开我的代码时仍然可以。

【问题讨论】:

  • 有没有发生这种情况的尝试可以告诉我们?
  • @CorayThan No 在抛出异常后它传播到junit并显示在控制台上。在我的代码的最后一个位置,原因就在那里。之后,如果我进入调试器,我将不再使用我编写的代码。

标签: java exception-handling junit


【解决方案1】:

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

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

如您所见,我正在检查版本 3.1.1,所以如果您有不同的版本,请查看正确的源代码(我怀疑无论如何都会有所不同)。

【讨论】:

  • 但是 RollbackException 设置了 cause (它在调试器中可见):见截图。
  • 捕获异常后重新抛出异常会怎样?原因会消失吗?我的意思是:@Test public void foo() throws Throwable { try { /* test code generating the exception */ } catch ( Exception e ) { /* here the exception cause is still there */ throw e; }
  • 没有变化。如果我创建一个新异常 (throw new Exception(e)),我会在堆栈跟踪中看到其他原因,但 RollbackException 的原因仍然不存在。
【解决方案2】:

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

来自Junit task documentation

filtertrace 从错误和失败堆栈跟踪中过滤掉 Junit 和 Ant 堆栈帧。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多