当你开开心心搭建了一个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文件,但是其他类文件的存放以及打包倒是用过,这个后面再说。
现在来确切说说第二种。这里是有坑的
比如,会在别处看到一些这样的配置。实际上src/main/resources下的文件都会被打包,如果把图中那段注释解开,你会发现除了xml和properties文件,其他东西都没打包进去(如果你使用的是yml配置,那么yml也不会被打包进去),图中的这位博主估计也是发现了这段代码的弊大于利。
这里就牵扯出一个问题了。如果我的项目中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
当看到路径里mapper/**/*.xml
时,不知怎么的,我就自作聪明把mapper给删掉了,/**/*.xml
,看似是指向下一级目录的xml文件,但是当你自作聪明的删掉了这里之后,你会发现xml虽然打包进去了,但是你的dao依然找不到mapper,还是报错。
血的教训啊,童鞋们切记这个路径是:包名/xml所在目录/**/*.xml
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://lebron.blog.csdn.net/article/details/123241356
内容来源于网络,如有侵权,请联系作者删除!