我有一个WAR应用程序如下:
- JPA/休眠 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
以各种方式标记事务,但无济于事。
如果您需要任何其他信息,请告诉我。非常感谢您的帮助!