1

当我将我的类打包到 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]

但是到了实际在事务方法中工作的时候,它就出现了不允许创建事务的异常。

4

1 回答 1

0

从它的外观来看,正在扫描该注释的任何内容都只是处理 jars 而不是 WEB-INF/classes 下的类

[编辑] 码头没有扫描这些注释

于 2012-09-27T23:36:27.763 回答