ssm事务开启失败,网上查找资料任然未解决

问题遇到的现象和发生背景
         在学习ssm集合框架的时候,搭建了一个小型的ssm项目,用以熟悉ssm框架,在准备开启ssm框架的事务时,无法开启事务。

          出现问题后在网上查找问题,搜到如下解决方案:
           1:区分springmvc容器和spring父容器的扫描范围,防止事务失效。
           2@Transactional后添加 propagation = Propagation.REQUIRED, rollbackFor = Throwable.class属性。
           3:开启注解事务的时候 属性修改为  proxy-target-class="true"
      

以上解决方案均未解决我项目的问题。
以下为我项目的项目结构

img

以下为我项目的配置文件 spring-dao.xml,spring-web.xml,spring-service.xml,web.xml,mybatis-config.xml

spring-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 配置整合mybatis过程 -->
    <!--    注解扫描-->
    <context:component-scan base-package="selflearn.springmvc.first">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 1.配置数据库相关参数properties的属性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties" />



    <!-- 2.数据库连接池 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!-- 配置连接池属性 -->
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="jdbc:mysql://localhost:3306/mysql?characterEncoding=utf8&amp;serverTimezone=UTC&amp;serverTimezone=Asia/Shanghai" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />


<!--        &lt;!&ndash; c3p0连接池的私有属性 &ndash;&gt;-->
<!--        <property name="maxPoolSize" value="30" />-->
<!--        <property name="minPoolSize" value="10" />-->
<!--        &lt;!&ndash; 关闭连接后不自动commit &ndash;&gt;-->
<!--        <property name="autoCommitOnClose" value="false" />-->
<!--        &lt;!&ndash; 获取连接超时时间 &ndash;&gt;-->
<!--        <property name="checkoutTimeout" value="10000" />-->
<!--        &lt;!&ndash; 当获取连接失败重试次数 &ndash;&gt;-->
<!--        <property name="acquireRetryAttempts" value="2" />-->

    </bean>

    <!-- 3.配置SqlSessionFactory对象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <!-- bean 使用别名 -->
        <property name="typeAliasesPackage" value="selflearn.springmvc.first.bean" />
        <!-- 扫描sql配置文件:mapper需要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml" />
    </bean>


    <!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <!-- 给出需要扫描Dao接口包 -->
        <property name="basePackage" value="selflearn.springmvc.first.Dao" />
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 配置基于注解的声明式事务 -->
    <tx:annotation-driven  proxy-target-class="true" />



</beans>



spring-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 扫描service包下所有使用注解的类型 -->
    <context:component-scan base-package="selflearn.springmvc.first.service.serviceimpl" />


</beans>


spring-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <!-- 配置SpringMVC -->
    <!-- 1.开启SpringMVC注解模式 -->
    <!-- 简化配置:
        (1)自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter
        (2)提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持
    -->
    <mvc:annotation-driven />

    <!-- 2.静态资源默认servlet配置
        (1)加入对静态资源的处理:js,gif,png
        (2)允许使用"/"做整体映射
     -->
    <mvc:default-servlet-handler/>

    <!-- 3.配置jsp 显示ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 配置多媒体文件解析器 (文件上传下载)-->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设定默认编码 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 设定文件上传的最大值2MB, 2*1024*1024 -->
        <property name="maxUploadSize" value="2097152"></property>
        <!--resolveLazily属性启用是为了推迟文件解析,以便在UploadAction 中捕获文件大小异常-->
        <property name="resolveLazily" value="true"/>
    </bean>

    <!-- 4.扫描web相关的bean -->
    <context:component-scan base-package="selflearn.springmvc.first.Controller" />



</beans>


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">


    <!-- 加载spring容器 -->
    <!-- 初始化加载application.xml的各种配置文件 -->

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring-dao.xml,spring/spring-service.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 配置springmvc前端控制器 -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation,
         springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-web.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


    //乱码问题
    <filter>
        <description>字符编码过滤器</description>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
<!--        <init-param>-->
<!--            <param-name>forceEncoding</param-name>-->
<!--            <param-value>true</param-value>-->
<!--        </init-param>-->
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>




    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.ico</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.png</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.gif</url-pattern>
    </servlet-mapping>


</web-app>

mybaits-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="LOG4J" />
        <setting name = "cacheEnabled" value = "true" />
        <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
        <setting name="useGeneratedKeys" value="true" />

        <!-- 使用列别名替换列名 默认:true -->
        <setting name="useColumnLabel" value="true" />

        <!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>

    <typeAliases>
        <!--
            alias:定义的别名
            type:指定要起别名的类型全类名
            默认别名就是类名小写
        -->
        <typeAlias alias="user" type="selflearn.springmvc.first.bean.User"/>
        <typeAlias alias="book" type="selflearn.springmvc.first.bean.Book"/>
        <typeAlias alias="userbook" type="selflearn.springmvc.first.bean.UserBook"
        />

    </typeAliases>


以下为我的测试文件

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
@Service
@Component
public class Bookservice {
    @Autowired
    private BookDao bookDao;

    @Autowired
    private UserBook userBook;

    @Autowired
    private Book book;

    @Autowired
    private User user;

    @Qualifier("UserBookDao")
    @Autowired
    private UserBookDao userbookDao;

    private static Bookservice bookservice;

    @PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
    public void init() {
        bookservice = this;
    }

   @Test
    public void insertT(){
    bookservice.book.setName ("测试名称");
    bookservice.book.setAuthor ("我1");
    bookservice.book.setFileUrl ("文件路径");
    bookservice.book.setImg ("图谱路径");
    bookservice.bookDao.add (bookservice.book);
        throw new RuntimeException("huigun");

    }

希望能帮我解决这个问题,不甚感激

img


别搞这些花里胡哨的东西,自己去写代码调用这个方法,再看结果