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

一、问题说明

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

二、集成方式

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

    <!-- 数据连接池 -->
    <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver.dev}"></property>
        <property name="url" value="${jdbc.url.dev}"></property>
        <property name="username" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!-- 事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="datasource"></property>
    </bean>

    <!-- 事务配置1:需手动注解 -->
    <!-- proxy-traget-class true对类进行代理,如果是false表示对接口进行代理,使用时需要在类或者方法上加上 @Transactional 注解。 -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

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

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

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

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

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

三、分析

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

四、解决方法

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

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

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

搭建项目Maven+springMVC+hibernate时,JUnit测试出现报ClassNotFoundException错误的解决

最近在搭建Maven+springMVC+hibernate项目,正常启动项目时一切正常,但JUNIT测试时出现报ClassNotFoundException错误,经过仔细排查发现没有生成class文件. 现在解决如下:

Struts2+Spring+Mybatis+Junit 测试

Struts2+Spring+Mybatis+Junit 测试 博客分类: HtmlUnit Junit Spring 测试 Mybatis Java代码   package com.action.kioskmonitor; /** * Junit群体测试Struts2 .spring.Mybatis */ import static org.junit.Assert.assertNotNull; import java.util.List; import java.util.UUID; imp

springmvc controller junit 测试

目录 1 建立UserController类 2 建立测试类 3 JUnit测试 4 几个jar包 第一次搭建SSM框架,整合SpringMVC完成后进行Controller测试,找资料并解决问题. 下图是我的完整目录: 回到顶部 1 建立UserController类 代码清单 1-1:UserController.java package org.sei.controller; import javax.annotation.Resource; import javax.servlet.ht

SpringMVC是用junit测试

架包支持:junit.jar;org.springframework.test-3.1.0.RELEASE.jar 测试Dao基础类:JUnitDaoBase Java代码   package test.test; import javax.annotation.Resource; import javax.sql.DataSource; import org.junit.runner.RunWith; import org.springframework.test.context.Contex

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

需求背景:由于最近总是接到一些需求,需要配合前端团队快速建设移动端UI应用或web应用及后台业务逻辑支撑的需求,若每次都复用之前复杂业务应用的项目代码,总会携带很多暂时不会用到的功能或组件,这样的初始工程就存在冗余代码. 在本文中,我们将使用Java语言开发集成环境IntelliJ IDEA(其倡言是智能编码?),应用maven构建SpringMVC整合Mybatis+MySQL5.7(流行框架)的web项目:目的在于快速构建一个简洁纯净版的web应用工程,将其作为一个基础web-demo,以便

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

前两篇springmvc的文章中都没有和mybatis整合,都是使用静态数据来模拟的,但是springmvc开发不可能不整合mybatis,另外mybatis和spring的整合我之前学习mybatis的时候有写过一篇,但是仅仅是整合mybatis和spring,所以这篇文章我系统的总结一下spring.mybatis和springmvc三个框架的整合(后面学习到maven时,我会再写一篇使用maven整合的文章,这篇没有用到maven). 1. jar包管理 我之前有写过一篇spring.hi

002杰信-陌生的maven-web项目整改成我们熟悉的Web架构;classpath的含义;ssm框架的整合;junit测试

这篇博客的资源来源于创智播客,先在此申明.这篇博客的出发点是jk项目,传智的做法是Maven的web模板生成的,但是这样子的结构目录与我们熟知的Web项目的结构目录相差很大,所以要按照我们熟知的项目结构来.这篇文章涉及到的最重要的是:1.加载各种配置文件时经常涉及到classpath,这个东西,要搞搞清楚,在web项目代表的是什么( WEB-INF文件夹下的classes目录).2.还有就是做一个项目时,建包的目录,3.用junit去测试框架的整合. 传智的做法是Maven的web模板生成的:

基于Maven的Mybatis+spring+springMVC框架整合(mapper代理方式)

首先看看整个Demo的骨架: 首先这个demo整合是基于maven的,maven下载配置我就不说了,网上也有很多大神配置的案例,鼠标右键点击new选择maven project.在选择select an Archetype的时候选择webapp,通过myeclipse新建的maven项目只有一个src/main/resources包,所以还要自己手动新建几个src folder.详情请参照上图,接着就是要在pom.xml中添加dependencies,就是所需要的jar包. <propertie

springboot2.0+mybatis多数据源集成

最近在学springboot,把学的记录下来.主要有springboot2.0+mybatis多数据源集成,logback日志集成,springboot单元测试. 一.代码结构如下 二.pom.xml文件如下 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation