今天调试多个dao层的service接口时,发现事物失效了,在数据库中产生了一条数据,但已经抛出了
RuntimeException.看到这个马上检查spring配置文件中事物配置,调试了半天,依旧存在这个问题,
写了这么久的项目,不应该出错的.然后就是各种百度,Google,好半天没有成果,最后终于发现是扫包问题.
在spring-mvc配置文件中扫包中包含了service层,spring如果要使事务生效,就需要cglib为对应service类生成代理子类,在spring.xml中已经生成了代理类,而在spring-mvc.xml中,又重新扫描了一遍,使得原先cglib生成的代理子类失效,从而事务拦截也失效。
spring-mvc.xml配置文件中扫包只扫controller层的
spring.xml配置文件中剔除controller层的扫包,也就是加上这句1
2
3<context:component-scan base-package="com.anber">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>