-
Spring 2.5.5 @Transactional 的问题40
在一个新项目里打算开始用Spring 2.5.5和大量使用annotation,可是@Transactional总是玩不转。
在applicationContext.xml里面:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <context:annotation-config/> <context:component-scan base-package="se.posten.ida"> <context:include-filter type="regex" expression=".*DAOImpl" /> <context:include-filter type="regex" expression=".*ServiceImpl" /> </context:component-scan> <tx:annotation-driven transaction-manager="transactionManager"/>
定义一个Business Interface:
public interface SomeService { void foobar(); }
实现类:
@Service("someService") public class SomeServiceImpl implements SomeService { @Resource(name="someDAO") private SomeDAO someDAO; @Transactional (readOnly=false, isolation = Isolation.READ_COMMITTED) public void foobar() { someDAO.foobar(); } }
Web Controller
public class SomeController { @Resource(name="someService") private SomeService someService; }
这里面用的是普通的JdbcTemplate, 结构是经典的Controller-Service-DAO.
换回经典的TransactionProxyFactoryBean, 工作的好好的。
我是不是什么地方忘配置了?
Classpath下面只有spring.jar 和 spring-mvc.jar,试了把 cglib-nodep-2.1_3.jar 拷贝过去也没用。
比如说我这个business method 调用DAO两个方法,第一个成功了,第二个违反数据库的constraint,失败了,那么事务回滚应该把第一个DAO的更改rollback,但是这里@Transactional一点作用都没有,打开Spring的logging发现它根本就没调用任何和Transaction有关的Interceptor.
比如我在business method里面,调用DAO方法后,写个throw new RuntimeException,那么如果事务配置好了,应该rollback, 但是这里Transaction一点作用没有。
如果把配置改成在XML里用TransactionProxyFactoryBean, 就工作了。
这个Transactional annotation就不工作。
折腾了一天,实在黔驴技穷了。
问题补充:
先扯点离题的:
实在不好意思,作为老会员,没有关心网站的新进展,前两天在Java论坛先发了个帖子问这个问题,发完了发现问题该发到问答频道去,于是又重发了一份,本来想发个短信给管理员删掉论坛帖子的,但当时已经半夜三点了,太困了,想第二天起来发,第二天起来管理员已经把论坛帖子移到问答频道去了,结果问答频道有两个同样的问题,
http://www.iteye.com/problems/2646
http://www.iteye.com/problems/2649
在两边都有热心网友回答。
这个2646号问题是我自己写的,40金悬赏旬,请大家去问题2646跟踪最新更新吧,特别感谢小疯子还自己写了程序试验。
我已经请求管理员删除这个2649号问题,把大家的回答搬到2646去。
问题补充:
sw2-long 的方式是工作的。yangke_love的解法要用到AspectJ,但在这里简单的情况下JDK Proxy完全可以胜任的。
已经向Spring Jira提交了一个bug 报告,SPR-5082
http://jira.springframework.org/browse/SPR-5082?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=38892
里面带了一个完整的事例来演示这个bug。
看看他们怎么回吧。2008年8月13日 03:47
3个答案 按时间排序 按投票排序
-
采纳的答案
我也碰到过这个问题,
估计spring初始化时优先component-scan bean,注入Web Controller 的Service直接拿了上下文中的@Service("someService"),这个时候@Transactional (readOnly=false, isolation = Isolation.READ_COMMITTED) 还没有被处理.所以Web Controller 的Service是SomeServiceImpl而不是AOP的$ProxyNO.
我的解决方法:
不让spring扫描到ServiceImpl类,直接写在xml文件,其它的配置和annotation照用,这样事务就起作用了.<beans ... default-autowire="byName" default-lazy-init="true"> <context:component-scan base-package="com.mycom.modules"> <context:exclude-filter type="regex" expression=".*ServiceImpl$" /> </context:component-scan> <bean name="helloService" class="com.mycom.modules.demo.SomeServiceImpl" /> ... </beans>
2008年8月13日 09:36
-
我在项目中也碰到了这样的情况。
我在项目中也和楼主的一样情况同,可能是少了下边的配置:
<aop:aspectj-autoproxy proxy-target-class="true"/>这个结点,这样Spring就没有到你声明的@Transactional 进进事务处理。
问题解决后的配置。<!-- 支持 @AspectJ 标记--> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 切面对象对业务方法调用进行性能监控 --> <bean id="methodRunMonitor" class="com.newer.core.test.MethodRunMonitor"/> <!-- 以AspectJ方式 定义 AOP --> <aop:config proxy-target-class="true"> </aop:config> <!--Hibernate TransactionManager--> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 支持 @Transactional 标记 --> <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>
2008年8月14日 08:33
相关推荐
spring 2.5.5源碼包,jar 包,源代碼 spring 2.5.5源碼包,jar 包,源代碼
开发一个基本的spring Application所需要用到的最小包: spring-beans.jar,spring-core.jar 开发一个基本的spring WebApplication所需要用到的最小包: spring-beans.jar,spring-core.jar,spring-web.jar,...
开发一个基本的spring Application所需要用到的最小包: spring-beans.jar,spring-core.jar 开发一个基本的spring WebApplication所需要用到的最小包: spring-beans.jar,spring-core.jar,spring-web.jar,...
spring2.5.5
spring2.5.5_API.rar,学习Spring的好帮手
spring2.5.5+struts2+ibatis2.3.4
spring2.5.5-lib.rar
spring2.5.5 api chm版,便于查询
org.springframework.core.JdkVersion 于是找到一个spring-core-3.x.RELEASE.jar,用其中的JdkVersion这个类替换spring-2.5.5.jar对应class,问题解决! 注意:别用spring-core-4.x.RELEASE.jar,JdkVersion....
NULL 博文链接:https://finallygo.iteye.com/blog/1040373
spring2.5.5 源码包,虽然很老,但有时候要看老代码,还是有用的
spring2.5.5里面是jar包
最新的Spring Spring Framework 2.5.5 is the current production release
spring2.5.5+struts2+ibatis2.3.4登录实例 例子
Hibernate3.3.2+Spring2.5.5+Struts2.1.6+Extjs3.0.0_Annotations方式快速开发框架资料。
spring3.04_struts2.18_hibernate3.55整合所有jar包 struts2+hibernate3.3.2+Spring2.5.5整合所有jar包
spring2.5.5+struts2+ibatis2.3.4登录实例.doc
Spring2.5.5+Struts2.0.11.2+JPA+Hibernate3.3实战
Struts2.1.6+Hibernate3.3.2+Spring2.5.5+Extjs3.0.0+Annotations,整合开发。