在Jetty中运行时出现IllegalTransactionStateException

时间:2013-08-26 02:54:45

标签: spring hibernate jpa jetty hibernate-envers

我有一个WAR应用程序如下:

  • JPA / Hibernate 4.1.9.Final
  • Hibernate Envers 4.1.9.Final
  • Spring 3.1.3.RELEASE
  • 使用JSON / REST的Spring MVC

我的前端(网页)发出请求,这导致要保存的新实体(这似乎在任何情况下都成功),然后Envers将保存相应的修订信息。

典型部署在Tomcat 7中,这可以正常工作。

对于单元测试,我以编程方式启动Jetty(8.1.9.v20130131),但失败了。令我感到困惑的是为什么这种行为是不同的。我只能想象Jetty与Tomcat有不同的(可能是标准的)交易管理,但我没有把它固定下来或以其他方式解决这个问题。

以下是我以编程方式创建Web应用程序的方法:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext.xml" })
public class AddCustomerTest {

server = new Server(serverPort);
WebAppContext webAppContext = new WebAppContext();
webAppContext.setContextPath("/webapp");
webAppContext.setWar("src/main/webapp");
webAppContext.setServer(server);
server.setHandler(webAppContext);

以下是我得到的基本例外:

Caused by: org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:357)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:334)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at com.sun.proxy.$Proxy115.getByUuid(Unknown Source)
    at com.totaalsoftware.incidentmanager.entity.audit.RevisionEntityListener.setUser(RevisionEntityListener.java:53)
    at com.totaalsoftware.incidentmanager.entity.audit.RevisionEntityListener.instanceNewRevision(RevisionEntityListener.java:40)
    at com.totaalsoftware.incidentmanager.entity.audit.RevisionEntityListener.newRevision(RevisionEntityListener.java:34)
    at org.hibernate.envers.revisioninfo.DefaultRevisionInfoGenerator.generate(DefaultRevisionInfoGenerator.java:95)
    at org.hibernate.envers.synchronization.AuditProcess.getCurrentRevisionData(AuditProcess.java:124)
    at org.hibernate.envers.synchronization.AuditProcess.executeInSession(AuditProcess.java:106)
    at org.hibernate.envers.synchronization.AuditProcess.doBeforeTransactionCompletion(AuditProcess.java:155)
    at org.hibernate.engine.spi.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:662)
    ... 80 more

我的RevisionEntityListener查找一些用户数据(当然,使用Hibernate从数据库中查找)。显然,没有可用的交易,但只有在Jetty中运行时才有。我已尝试以各种方式标记RevisionEntityListener交易,但无济于事。

如果您需要任何其他信息,请与我们联系。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

愚蠢的我......

以下两行是从其他一些测试类中复制过来的:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext.xml" })

这两行无用,因为整个应用程序是通过Jetty的实例化和配置加载的。但不知何故上面的内容与Jetty服务器中的应用程序发生冲突,可能是因为它位于同一个JVM中。从测试类中删除上面两行修复了它!