一、问题说明

项目框架采用SSM,集成了事务回滚(方式见下),在单元测试的时候,测试事务是有效的,但是在实际项目上线的时候,却没有效果。

二、集成方式

application-mybatis.xml(以下xml屏蔽了一些无关的细节)

  1. <!-- 数据连接池 -->
  2. <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
  3. <property name="driverClassName" value="${jdbc.driver.dev}"></property>
  4. <property name="url" value="${jdbc.url.dev}"></property>
  5. <property name="username" value="${jdbc.user}"></property>
  6. <property name="password" value="${jdbc.password}"></property>
  7. </bean>
  8.  
  9. <!-- 事务管理器 -->
  10. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  11. <property name="dataSource" ref="datasource"></property>
  12. </bean>
  13.  
  14. <!-- 事务配置1:需手动注解 -->
  15. <!-- proxy-traget-class true对类进行代理,如果是false表示对接口进行代理,使用时需要在类或者方法上加上 @Transactional 注解。 -->
  16. <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

application-common.xml  (关键是让Spring管理排除Controller部分)

  1. <!-- 会自动扫描com.mc.bsframe下的所有包,包括子包下除了@Controller的类。 -->
  2. <scpan:component-scan base-package="com.mc.bsframe">
  3. <scpan:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  4. <scpan:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
  5. </scpan:component-scan>

spring-mvc.xml (关键是只处理Controller部分)

  1. <!-- 只扫描base-package下的用Controller注解的类。 -->
  2. <context:component-scan base-package="com.mc.bsframe.controller">
  3. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  4. <!-- 必须要包括ControllerAdvice才能处理全局异常。 -->
  5. <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
  6. </context:component-scan>

基本关于事务的配置如上,但是我发现,偶尔会有失效的情况,

三、分析

为什么Junit4测试下有效,猜测因为Junit4下创建的是一个上下文对象,而实际项目是一个Spring上下文,一个SpringMVC上下文?

四、解决方法

在spring-mvc.xml中添加排除扫描Service的配置,以前语句仅仅是包含了Controller和ControllerAdvice,如下:

  1. <!-- 只扫描base-package下的用Controller注解的类。 -->
  2. <context:component-scan base-package="com.mc.bsframe.controller">
  3. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  4. <!-- 必须要包括ControllerAdvice才能处理全局异常。 -->
  5. <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
  6. <!-- !!!最好加上这句让SpringMVC管理的时候排除Service层,避免事务失效的问题。 -->
  7. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
  8. </context:component-scan>

MyBatis和SpringMVC集成事务在Junit测试下有效但是在实际项目无效的问题的更多相关文章

  1. Struts2+Spring+Mybatis+Junit 测试

    Struts2+Spring+Mybatis+Junit 测试 博客分类: HtmlUnit Junit Spring 测试 Mybatis  package com.action.kioskmoni ...

  2. springmvc controller junit 测试

    第一次搭建SSM框架,整合SpringMVC完成后进行Controller测试,找资料并解决问题. 下图是我的完整目录: 1 建立UserController类 代码清单 1-1:UserContro ...

  3. springboot集成junit测试与javamail测试遇到的问题

    1.springboot如何集成junit测试? 导入junit的jar包 使用下面注解: @RunWith()关于这个的解释看下这两篇文章: http://www.imooc.com/qadetai ...

  4. (2).mybatis单元测试(junit测试)

    一.Junit使用步骤:1.创建测试目录,(src.测试目录是test)2.在测试目录test中创建与src中相同的包名3.为需要测试的类创建测试类,例如:UsersMapper,测试类是UsersM ...

  5. 集成JUnit测试

    集成JUnit测试 既然使用了Spring,那么怎么集成到JUnit中进行测试呢,首先大家能够想到的肯定是: public class TestMain { @Test public void tes ...

  6. IDEA下使用maven构建web项目(SpringMVC+Mybatis整合)

    需求背景:由于最近总是接到一些需求,需要配合前端团队快速建设移动端UI应用或web应用及后台业务逻辑支撑的需求,若每次都复用之前复杂业务应用的项目代码,总会携带很多暂时不会用到的功能或组件,这样的初始 ...

  7. 【SpringMVC学习04】Spring、MyBatis和SpringMVC的整合

    前两篇springmvc的文章中都没有和mybatis整合,都是使用静态数据来模拟的,但是springmvc开发不可能不整合mybatis,另外mybatis和spring的整合我之前学习mybati ...

  8. 阿里P7终于讲完了JDK+Spring+mybatis+Dubbo+SpringMvc+Netty源码

    前言 这里普及一下,每个公司都有职别定级系统,阿里也是,技术岗以 P 定级,一般校招 P5, 社招 P6 起.其实阅读源码也是有很多诀窍的,这里分享几点心得: 首先要会用.你要知道这个库是干什么的,掌 ...

  9. mybatis-generator没有自动生成代码和Junit测试controller

    本来mybatis的generator想要自动生成增删改的,但是到后来语句就两个select,原因是数据中没有给字段加primary,就不会有删改增. 以及Controller的Junit测试 先导入 ...

随机推荐

  1. html音视频标签

    音视频标签是html5标签,分别为<audio></audio>和<video></video>,这两个标签用法大致相同,且都仅在IE9及以上版本和其他 ...

  2. Python简记

    1.字符换行: print('ab \ncd \nef')

  3. Linux下各类压缩文件命令小结

    .tar 解包:tar xvf FileName.tar    解包后原始文件仍存在 打包:tar cvf FileName.tar DirName1 Filename1 - 列出内容:tar tvf ...

  4. SpringMVC通过注解获得参数

    SpringMVC可以通过RequestParam注解来映射获得参数,具体用法如下: 例子: 配置过程省略 1.新建controller类 package com.loger.controller; ...

  5. 【第一篇】Volley的使用之json请求

    最近项目写完,有开始新的学习了,volley很久以前就接触了,也看了源码,然而却没有通过文章去记录自己的学习成果. 首先讲下volley的特点: 1,扩展性强.Volley 中大多是基于接口的设计,可 ...

  6. php 类型

    var_dump 打印出类型和值     整型inter用  decimal 表示为 decimal : [1-9][0-9]* | 0   (int) ( (0.1+0.7) * 10 ); 强制类 ...

  7. 如何解决两个li之间的缝隙

    如何解决两个li之间的缝隙的问题: 在做一个类似按钮左右滑动的选择器的动效,遇到了个是关于li之间的缝隙的问题: HTML如下: <span class="c1mChanger&quo ...

  8. Linux随笔(安装ftp,安装jdk,安装 tomcat,安装redis,安装MySQL)

    su: authentication failure 解决办法:sudo passwd root  更改密码即可 确认虚拟机用到的联网方式是桥接模式,不然Windows是ping不通Linux的,确保 ...

  9. 2、Web应用程序中的安全向量 -- CSRF/XSRF(跨站请求伪造)

    CSRF的概念可以分为两类:XSS和混淆代理. 混淆代理中的"代理"是指用户的浏览器.CSRF是基于浏览器的工作方式运作的.用户登录到一个站点后,用户的信息将会存储在cookie中 ...

  10. 【Loadrunner】初学Loadrunner——录制脚本、回放、以及优化

    一.脚本录制(录制) 打开Loadrunner > 选择创建/编辑脚本 > NewScript > 选择协议(单协议.多协议) > Strart Recording >选 ...