(已解决)确定mapper配置无误,且配置文件无误, 运行无误 出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 解决方案 – 常见于多模块服务部署下(适用于一个Tomcat实例部署情况)
如果着急修改错误 直接看代码部分哦
故事回放
今天又是老司机翻车的一天: 最近在做一个基于Maven多模块项目, 依仗着自己多年横趟单模块实现SSM的经历, 觉得多模块仅仅就是1 + 1 = 2的问题, 哪层料想, 这样天真的想法被现实一顿毒打
拿着以往的配置, 在maven的各个模块一顿CV操作, 是真的香; 只可恨maven看不惯你这么舒服 非要搞你心态:
好不容易做完一个业务逻辑,准备启动部署测试, 整个过程一气呵成, 没有任何错误 非常顺利, 这个顺利甚至让我以为自己已经是大佬了吗(居然可以一次性部署成功)
打开postMan兴高采烈在url上一顿准备测试, 心中早已预判了点下send按钮的出现喜悦画面已经想好如何吹逼自己牛b的时候.
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
当头棒喝 (蓝瘦香菇)
本能地以为就是自己那里CV操作有误(还沉浸在自己一统单模块部署ssm
的世界里, 无法自拔) 1个钟头过去了,没有任何进展 于是乎打算一一对比配置文件 甚至还一一对应mapper
文件,就这样 2个钟头过去了仍然解决不了, 心态开始崩了 终于放下最后的倔强(我是大佬, 我可以自己解决的) 求助度娘
结果都在说要么是配置文件写错了, 要么包导入错了 要么mapper文件(初学者必踩)写错了 总之搜了一圈大同小异, 没有实质进展
后来我开始转而去找其他人做的多模块项目 对比Maven配置文件(也许是出于经验, 我本能的想到多模块下maven的特殊性可能会出现一些问题) 终于在一个大佬的配置中发现了 一个不起眼的参数配置
<filtering>true</filtering>
为了便于理解我贴出它的精确位置
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
起初我没太在意这个东西, 因为自己曾经也用过maven部署web项目 没有加入过这个配置 也能访问 所以没怎么care, 后来实在是没辙了 就死马当活马医,
结果是加入后瞬间起飞 : 一方面感动自己 一方面懵逼良久
究其原因
首先这个参数的含义是: 启动配置文件中的**${}**过滤 比如我们在配置文件常常定义一些参数 最常见就是db.properties的驱动参数
你在spring的配置文件中使用时是不是采用**${}**进行访问 它的作用就是开启这个符号的识别(默认是关闭的)
那为啥以前不用配置 也能正常访问?
以下内容为笔者推断不具备真实性, 请慎重考虑
-
我首先想到以前我们处理的项目就只有一个web模块 也就是说所有有关的配置文件都在一起, 那么maven完全可以基于单模块自动识别 同一个resource下的资源
-
而多模块下, 我们有好几个web模块也就是说会有多个resource目录 那maven就无法判断了(详见注解)如果你用${}去访问资源 那么到底访问那一个资源呢(比如同时依赖db.properties进行数据库的访问) 所以maven在开启了pom.xml的一个参数配置
filting
如果显示指定为true
那么肯定是访问当前模块的资源目录注意:这里无法判断是指 在同一个Tomcat环境下 部署多个war 或者说多模块启动都是基于一个Tomcat实例 如果你是把多模块部署分别在不同的tomcat里那么 本文自动失效
以上就是笔者的大胆推论, 至于验证就留待以后解决,如果各位童鞋有确定的想法可以在评论留言哦!
彩蛋
有没有童鞋还不会配置tomcat同时部署多个war或者虽然你部署了多个但是只能启动一个呐?
原因很简单: 看截图哦
看懂了吗 现在可以启动了 进行的玩耍你的多模块项目吧!