SpringBoot踩坑记录(1)Invalid bound statement (not found)引发的一些列问题
SpringBoot踩坑记录(1)
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也不会被打包进去),图中的这位博主估计也是发现了这段代码的弊大于利,233.
这里就牵扯出一个问题了。如果我的项目中resource下只有xml,和properties文件,这段配置也无伤大雅咯?是的,的确是这样,templates和static下似乎是能打包进去的。
在解决了xml打包之后,我们迫不及待的继续打包运行,发现依旧是那个报错,emmmmmmm,这让人不禁有些头大。翻开前辈的项目,发现了在yml下,还配置了mybatis
mybatis: mapper-locations: classpath:com/xx/xxx/mapper/**/*.xml type-aliases-package: com.xx.xxx.entity configuration: cache-enabled: false
很好,粘过来改成我们的包名,应该能解决了
坑.2 Mybatis路径配置须小心
当看到路径里mapper/**/*.xml时,不知怎么的,我就自作聪明把mapper给删掉了,/**/*.xml,看似是指向下一级目录的xml文件,但是当你自作聪明的删掉了这里之后,你会发现xml虽然打包进去了,但是你的dao依然找不到mapper,还是报错。
血的教训啊,童鞋们切记这个路径是:包名/xml所在目录/**/*.xml
暂时写到这里,下次有空再更