SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题

x33g5p2x  于2022-03-07 转载在 Spring  
字(1.7k)|赞(0)|评价(0)|浏览(315)

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/**/*.xml
  type-aliases-package: com.xx.xxx.entity
  configuration:
    cache-enabled: false

坑.2 Mybatis路径配置须小心

当看到路径里mapper/**/*.xml时,不知怎么的,我就自作聪明把mapper给删掉了,/**/*.xml,看似是指向下一级目录的xml文件,但是当你自作聪明的删掉了这里之后,你会发现xml虽然打包进去了,但是你的dao依然找不到mapper,还是报错。

血的教训啊,童鞋们切记这个路径是:包名/xml所在目录/**/*.xml

相关文章