如果当框架搭建完成,并反复确认框架的配置文件、事务声明都没有问题,但就是不会滚。
原配置文件如下:
springmvc的配置文件
<context:component-scan base-package="com.dncps.*" /><!-- **错误的注入** -->
<!-- 配置映射器与适配器 -->
<mvc:annotation-driven></mvc:annotation-driven>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/fonts/**" location="/fonts/"/>
<mvc:resources mapping="/images/**" location="/images/"/>
原spring的配置文件
<!-- **1没有注入** -->
<!-- 2加载数据资源文件 -->
<context:property-placeholder location="classpath:resources/db.properties" />
<context:property-placeholder location="classpath:resources/log4j.properties" />
<!-- 3配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 自动转json,处理乱码 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJackson2HttpMessageConverter" />
</list>
</property>
</bean>
<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>text/json;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 4配置sessionfactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
<property name="typeAliasesPackage" value="com.dncps.value" />
<!-- 显式指定Mapper文件位置 -->
<property name="mapperLocations" value="classpath:mapper/*Mapper.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 5配置session -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory" />
</bean>
<!-- 6、声明式事务管理,依赖于前面声明的dataSource数据源 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 7、注解事务切面 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 8总错误处理-->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView">
<value>/error/error</value>
</property>
<property name="defaultStatusCode">
<value>500</value>
</property>
<property name="warnLogCategory">
<value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value>
</property>
</bean>
在上面的两个配置文件都是正确的,并且也使用@Transactional
进行事务声明,项目可以正常运转,但就是在错了的时候事务不回滚。困扰了好久。
知道看到一位仁兄的一篇博客,他也是有这样的问题,最后解决了。
这个问题不是事务配置的问题,而是扫描前后顺序的问题。在之前的springmvc配置文件中,我扫描了所以的bean文件,但我们是用spring声明管理事务的。
即我们xml加载的springmvc配置时扫描了所有的bean文件,其中有springmvc管理的也有spring管理的,而我们通过spring声明事务时,spring没有扫描和管理bean的配置,即没有权利,所以bean文件并不会被spring管理,所以不会错误回滚。配置文件不同管理域也不同,储存不同地方的东西,但是都可以注入文件。
明白了这个后问题就不是问题了,配置springmvc是管理控制层的,只需注入control层就好,而spring中有事务、切面、sessionfactory等等,可以扫描全部进行注入。
修改后:
将错误的注入修改为<context:component-scan base-package="com.dncps.action" />
将没有注入修改为<context:component-scan base-package="com.dncps.*" />
重启运行OK
最后附上仁兄地址以表感谢:http://blog.csdn.net/xiaoyu19910321/article/details/52457482#reply