0

次のようなWARアプリケーションがあります。

  • JPA/Hibernate 4.1.9.Final
  • Hibernate Envers 4.1.9.Final
  • 春 3.1.3.RELEASE
  • JSON/REST を使用した Spring MVC

フロントエンド (Web ページ) が要求を行い、これにより新しいエンティティが保存され (これはいずれにせよ成功したようです)、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さまざまな方法でトランザクションをマークしようとしましたが、役に立ちませんでした。

他に情報が必要な場合はお知らせください。あなたの助けに感謝します!

4

1 に答える 1