Spring 在Jetty中运行时出现非法TransactionStateException

Spring 在Jetty中运行时出现非法TransactionStateException,spring,hibernate,jpa,jetty,hibernate-envers,Spring,Hibernate,Jpa,Jetty,Hibernate Envers,我有一份战争申请,如下所示: JPA/Hibernate 4.1.9.Final Hibernate Envers 4.1.9.4最终版本 弹簧3.1.3.释放 带JSON/REST的Spring MVC 我的前端(网页)发出请求,这将导致保存一个新实体(这似乎在任何情况下都会成功),然后Envers将保存相应的修订信息 典型的部署是在Tomcat7中,在那里工作得很好 对于单元测试,我以编程方式启动了一个Jetty(8.1.9.v20130131),但失败了。这让我困惑,为什么这种行为是不

我有一份战争申请,如下所示:

  • JPA/Hibernate 4.1.9.Final
  • Hibernate Envers 4.1.9.4最终版本
  • 弹簧3.1.3.释放
  • 带JSON/REST的Spring MVC
我的前端(网页)发出请求,这将导致保存一个新实体(这似乎在任何情况下都会成功),然后Envers将保存相应的修订信息

典型的部署是在Tomcat7中,在那里工作得很好

对于单元测试,我以编程方式启动了一个Jetty(8.1.9.v20130131),但失败了。这让我困惑,为什么这种行为是不同的。我只能想象Jetty的事务管理与Tomcat不同(也许标准较低),但我没能将其固定下来,也没能解决这个问题

以下是我如何以编程方式创建web应用程序:

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

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

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
标记为事务性的,但没有成功

如果您需要任何其他信息,请告诉我。非常感谢你的帮助

愚蠢的我

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext.xml" })
这两行代码毫无用处,因为整个应用程序都是通过Jetty的实例化和配置加载的。但不知何故,上述内容与Jetty服务器中的应用程序发生了冲突,可能是因为它们位于同一个JVM中。从测试类中删除上述两行可以修复它

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