当我将我的类打包到 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]
但是到了实际在事务方法中工作的时候,它就出现了不允许创建事务的异常。