SSM整合BUG踩坑第一天

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

前言

最近把之前学习javaWeb串通的项目拿出来整合SSM,记录整合开发的日常BUG及解决办法,SSM整合遇到了不少“坑”,下面看看都遇到哪些“雷区”。

BUG1

java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;

image-20220404153610108

当我感慨终于把maven整合SSM项目的结构搭建好,配置文件都整好的时候,理论是没啥大问题的,运行tomcat就嘎嘎报这个错误。第一感觉是mybatis配置出错了,于是又挨个把项目的配置文件都检查一遍,还是报错。又借助百度查找一番,解决办法都指向了mybatis和mybatis-spring俩jar包不兼容的问题,版本不匹配导致报错,这是在spring整合mybatis的常见问题。

下面是我整合好的版本依赖:

     <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>1.3.2</version>
      </dependency>
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.1</version>
      </dependency>
复制代码

在maven仓库搜索mybatis-springjar包时,发现每一个版本也都有说明对应的spring和mybatis版本。贴上地址大家可以研究一下: 点击这里打开链接

BUG2

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'javax.sql.DataSource' for property 'dataSource'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'javax.sql.DataSource' for property 'dataSource': no matching editors or conversion strategy found
复制代码

image-20220404161112637

第一眼看控制台输出,applicationContext.xml(sping配置文件)bean加载失败,dataSource参数类型javax.sql.DataSource错误转化java.lang.String。查看spring配置文件,嗯,第一遍没有发现问题,又仔细查看SqlSessionFactoryBean的创建。

image-20220404161827698

作为初学者一定要注意这个点,很容易就会出现错误,关键IDEA不会主动提示你这里写错了,如果第一眼没发现,后面可能就会陷入一遍一遍研究配置文件的循环……甚至会产生各种怀疑,再次不多赘述。

不过在spring配置文件中配置mybatis扫描器时,注入sqlSessionFactory时就需要用value接收

image-20220404162616564

如果用ref IDEA会主动报错,这里出错的机率会小一点点。

image-20220404162843133

BUG3

org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]
复制代码

先看下我把配置文件都放哪了

image-20220404163554736

报错提示我的springmvc配置文件解析失败,文件没有找到,可是目录下明明就有呀。疑惑一阵,顺着报错往下看:不能打开ServletContext 资源,后面的路径显示在/WEB-INF/dispatcherServlet-servlet.xml下,实际上在WEB-INF下也并没有这个文件,而且我的springmvc配置文件后面也没有-servlet。

再看看web.xml注册springmvc情况(嗯嗯,看似妥得一塌糊涂呐,其实问题已经很明显了)。

image-20220404164359223

在做ssm整合时引入springmvc一般有两种方式:

  • 直接将springmvc配置文件创建在/WEB-INF/下,不过对文件命名有要求:配置文件名必须是web.xml中注册中央处理器标签内的名字加上-servlet 。我这里修改就需要把配置文件创建在/WEB-INF/下,名称为dispatcherServlet-servlet.xml

  • 可以将配置文件放在resources目录下,在web.xml中指明配置文件的路径就行

     <servlet>
            <!--注册中央处理器-->
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                    <!--需要指明springmvc配置文件的路径-->
                    <init-param>
                        <param-name>contextConfigLocation</param-name>
                        <param-value>classpath:dispatcherServlet.xml</param-value>
                    </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <!--处理所有请求-->
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    复制代码

我采用第二种方式顺利解决了问题。

虽然不是很难的3个BUG,但困扰了我很久,害,一言难尽,程序终于顺利调通。

但在和数据库交互时会有以下输出

image-20220404170625302

虽然不影响程序运行,在网上找了很多办法目前还没有解决,路过的大神烦请指教一波。

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@468d96cf] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@50c7d8a0] will not be managed by Spring
复制代码

本篇文章先到这里啦,后面陆续会有新BUG更新,尽情期待……

猜你喜欢

转载自juejin.im/post/7082678038193766430