一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情
前言
最近把之前学习javaWeb串通的项目拿出来整合SSM,记录整合开发的日常BUG及解决办法,SSM整合遇到了不少“坑”,下面看看都遇到哪些“雷区”。
BUG1
java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;
当我感慨终于把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
复制代码
第一眼看控制台输出,applicationContext.xml(sping配置文件)bean加载失败,dataSource参数类型javax.sql.DataSource错误转化java.lang.String。查看spring配置文件,嗯,第一遍没有发现问题,又仔细查看SqlSessionFactoryBean的创建。
作为初学者一定要注意这个点,很容易就会出现错误,关键IDEA不会主动提示你这里写错了,如果第一眼没发现,后面可能就会陷入一遍一遍研究配置文件的循环……甚至会产生各种怀疑,再次不多赘述。
不过在spring配置文件中配置mybatis扫描器时,注入sqlSessionFactory时就需要用value接收
如果用ref IDEA会主动报错,这里出错的机率会小一点点。
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]
复制代码
先看下我把配置文件都放哪了
报错提示我的springmvc配置文件解析失败,文件没有找到,可是目录下明明就有呀。疑惑一阵,顺着报错往下看:不能打开ServletContext 资源,后面的路径显示在/WEB-INF/dispatcherServlet-servlet.xml下,实际上在WEB-INF下也并没有这个文件,而且我的springmvc配置文件后面也没有-servlet。
再看看web.xml注册springmvc情况(嗯嗯,看似妥得一塌糊涂呐,其实问题已经很明显了)。
在做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,但困扰了我很久,害,一言难尽,程序终于顺利调通。
但在和数据库交互时会有以下输出
虽然不影响程序运行,在网上找了很多办法目前还没有解决,路过的大神烦请指教一波。
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更新,尽情期待……