问题背景
目的是构建一个Spring Boot工程,连接本地数据库,进行SQL方面的研究。构建过程遇到两个问题,随笔记下。
问题描述
问题一: 启动项目时,找不到mapper文件(项目直接起不来,如下图)
问题二:启动项目后,访问Controller中方法时报500(如下图)
解决思路
问题一:
-
首先mapper文件其实是接口(interface)对应的实现类,通常这两个文件与对应的pojo都不是我们手动去写的,而是通过mybatis的一款插件generator来生成的。所以注意力不应该放在这三个类的内容上,可以确定的是这是配置的问题。
-
从图中也可以清晰的看到:使用@Autowired注解,没有注入对应的mapper文件(也就是说对应的接口没有被IOC管理)。目标定位到接口(interface)上
-
发现缺少接口上缺少注解,添加@Mapper注解,添加过程中发现缺少相关依赖。
-
在pom.xml中添加@Mapper注解对应的依赖
-
接口添加@Mapper注解,项目正常启动(@Mapper将接口交于IOC管理,@Autowired可以注入)
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
问题二:
-
项目正常启动,打开浏览器输入访问路径,控制台报500错误(问题描述第二个图)
-
这个时候怀疑是不是标签上的id与方法不一致(自动生成的文件,可能性很小,但是不排除)
-
尝试使用mapper文件中其他方法,都会报这个错,只是方法名不同
-
问题在于Spring Boot根本没有找到这个类
-
找到target查看mapper文件是否被打包编译
-
在pom.xml文件中添加如下配置,重新启动项目发现mapper文件也被打包了,解决问题
<!-- 如果当前pom里有<build>标签,就粘贴<resources>标签及子标签内容 --> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.* </include> </includes> </resource> </resources> </build>
问题总结
解决这两个问题需要一定的基础知识,比如在@Autowired注入bean失败时,你就应该知道是这个bean没有被IOC管理,当你发现所有方法都报同一个错误时,你应该想到是这个mapper文件没有被编译。这个时候如果你看过一遍mybatis官方文档,你知识储备里就知道mapper文件可以放在两个位置,一个是在resources下与java文件夹同目录的包下,另一个是在于同名的接口放在一起(本例就是这种方式)。加上这个知识储备,很快就能知道是位置的问题,接着百度一下,问题很容易就得到解决。
如果对mybatis与spring的ioc原理不熟悉的,建议看如下两篇文章,快速入门SSM,Spring Boot等企业级开发框架:
初学SSM框架感觉一团糟,希望这篇文章能帮到你!(Spring)
初学SSM框架感觉一团糟,希望这篇文章能帮到你!(Mybatis)