SpringBoot踩坑记录
Invalid bound statement (not found)引发的一些列问题
当你开开心心搭建了一个SpringBoot项目,用插件生成了entity、dao、mapper,写下第一个Controller准备试一下,结果却发现一条简单的查询报错了。
{"timestamp": "2019-03-18 16:21:48","status": 500,"error": "Internal Server Error","message": "Invalid bound statement (not found): com.xxx.dao.UserMapper.selectByPrimaryKey","path": "/test"}
经过排查,发现target/classes/包名目录下不存在mapper文件夹,一个令人伤心的事情。
于是我们知道了关键所在,怎么把mapper下的xml文件打包进去。通过查阅资料,我们知道了解决这个问题通常有两个思路:
1.将mapper放在src/main/resource 目录下,这个目录下默认是会打包进去的。
2.在pom文件的
<build></build>
节点内,添加一段
<resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes><!-- 是否替换资源中的属性--><filtering>false</filtering></resource>
</resources>
3.当你打包时,手动把xml文件所在的mapper文件夹丢进target/classes/包名/目录下。需要丢一次+运行一次就好了
以上3种方法我只试过下面两种,上面那种虽然没有确切放过xml文件,但是其他类文件的存放以及打包倒是用过,这个后面再说。
现在来确切说说第二种。这里是有坑的
坑.1 配置过度导致捡了芝麻丢了西瓜
比如,会在别处看到一些这样的配置。实际上src/main/resources下的文件都会被打包,如果把图中那段注释解开,你会发现除了xml和properties文件,其他东西都没打包进去(如果你使用的是yml配置,那么yml也不会被打包进去),图中的这位博主估计也是发现了这段代码的弊大于利。
这里就牵扯出一个问题了。如果我的项目中resource下只有xml,和properties文件,这段配置也无伤大雅咯?是的,的确是这样,templates和static下似乎是能打包进去的。
在解决了xml打包之后,我们迫不及待的继续打包运行,发现依旧是那个报错,emmmmmmm,这让人不禁有些头大。翻开前辈的项目,发现了在yml下,还配置了mybatis
mybatis:mapper-locations: classpath:com/xx/xxx/mapper/**/*.xmltype-aliases-package: com.xx.xxx.entityconfiguration:cache-enabled: false
坑.2 Mybatis路径配置须小心
当看到路径里mapper/**/*.xml
时,不知怎么的,我就自作聪明把mapper给删掉了,/**/*.xml
,看似是指向下一级目录的xml文件,但是当你自作聪明的删掉了这里之后,你会发现xml虽然打包进去了,但是你的dao依然找不到mapper,还是报错。
血的教训啊,童鞋们切记这个路径是:包名/xml所在目录/**/*.xml