2013-08-26 22 views
0

運行時,我有一個WAR應用程序如下:IllegalTransactionStateException在碼頭

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

我的前端(網頁)發出請求,這將導致一個新的實體將被保存(這似乎在任何C成功ase),然後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交易,但無濟於事。

讓我知道你是否需要任何其他信息。非常感謝您的幫助!

回答

0

愚蠢的我...

以下兩行從其他一些測試類中複製過來:因爲整個應用程序通過實例化和配置加載

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

這兩行毫無意義的碼頭。但不知怎的,上面的內容與Jetty服務器中的應用程序發生衝突,可能是由於在同一個JVM中。從測試類中刪除上面的兩行修復了它!