クラスを WEB-INF/classes にパッケージ化すると、Spring @Transactional メソッド (またはポイントカット定義に一致するメソッドのいずれか) がトランザクションに参加しません。ログに「Hibernate セッションが見つかりません。構成が許可されていません...」という例外が多数記録されています。不可解なのは、スタック トレースで CGLIB 拡張クラスを確認できるため、プロキシされているように見えますが、新しいトランザクションが作成されていないように見えることです。
ただし、同じクラスを jar ファイルにパッケージ化し、jar ファイルを WEB-INF/lib に配置すると、アプリケーションは正常に動作します。トランザクションが作成されるなど、ここで何が起こっているのですか? クラスが WEB-INF/classes の下にあると機能しないのはなぜですか?
Spring トランザクション構成は次のとおりです。
<aop:aspectj-autoproxy proxy-target-class="true" />
<context:component-scan base-package="com.example" />
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="serviceAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="servicePointcut" expression="execution(* com.example.service.*.*Service*.*(..))"/>
<aop:advisor advice-ref="serviceAdvice" pointcut-ref="servicePointcut"/>
</aop:config>
FWIW、私は Jetty 7.4 と Spring 3.1.2 を使用しています。
何を探すべきかについての手がかりはありますか?
アップデート:
Spring トランザクション ログを有効にすると、次のことがわかります。
28 Sep 2012 15:07:16,126 DEBUG NameMatchTransactionAttributeSource:94 - Adding transactional method [save*] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT]
28 Sep 2012 15:07:16,133 DEBUG NameMatchTransactionAttributeSource:94 - Adding transactional method [update*] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT]
28 Sep 2012 15:07:16,134 DEBUG NameMatchTransactionAttributeSource:94 - Adding transactional method [delete*] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT]
28 Sep 2012 15:07:16,136 DEBUG NameMatchTransactionAttributeSource:94 - Adding transactional method [*] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly]
しかし、トランザクションメソッドで実際に動作するようになると、トランザクションの作成が許可されないという例外が爆発します。