MyBatis 抛出 BindingException 异常可能是你忘了配置资源拷贝
最近博主在搭建 Mybatis 项目时遇到了一问题,在一切配置妥当后,开始运行测试代码,但是此时控制台无情的抛出了异常:
开始寻找问题根源
咦?难道是我哪里写错,我的第一反应是我的 xml 配置文件哪里写错了,我开始检查下面几个点:
- XML 文件是否与 Mapper 代码在通过一个包中。
- XML 配置文件文件名是否与 Mapper 代码文件名相同。(在使用
<package>
设置 mapper 配置文件位置时,必须要保证第一点和第二点) - Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同。
- Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同 。
- Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同。
- Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同。
检查完成后,我发现都没有问题,那就奇怪了,这问题到底出在哪了呢?此时我看来一下编译后的目标文件夹中,发现我的 mapper 配置文件并没有被编译进去。
原来在典型的 maven 工程中,目录结构有: src/main/java
和 src/main/resources
,前者是用来存放 java 源代码的,后者则是存放一些资源文件,比如配置文件等,在默认的情况下 maven 打包的时候,对于 src/main/java 目录只打包源代码,而不会打包其他文件。所以此时如果把对应的 mapper 文件放到 src/main/java
目录下时,不会打包到最终的 jar 文件夹中,也不会输出到 target
文件夹中,由于在进行单元测试的时候执行的是 /target
目录下 /test-classes
下的代码,所以在测试的时候也不会成功。
如何解决资源拷贝问题
方式一:默认 Maven 构建
为了实现在 maven 默认环境下打包时,Mybatis 的接口和 mapper 文件在同一包中,可以通过将接口文件放在 src/main/java 某个包中,而在 src/main/resources 目录中建立同样的包,这是一种约定优于配置的方式,这样在 maven 打包的时候就会将 src/main/java
和 src/main/resources
相同包下的文件合并到同一包中。
方式二:更改 Maven 的构建配置
我们需要在 Maven 项目的 pom.xml 文件中配置下列代码:
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
采用上述方法中任意一个,然后重新运行测试代码,BindingException 异常的问题就解决了。
延伸阅读:
暂无内容!
评论列表 (0条):
加载更多评论 Loading...