MyBatis 抛出 BindingException 异常可能是你忘了配置资源拷贝

 5个月前     4  

文章目录

最近博主在搭建 Mybatis 项目时遇到了一问题,在一切配置妥当后,开始运行测试代码,但是此时控制台无情的抛出了异常:
MyBatis 抛出 BindingException 异常可能是你忘了配置资源拷贝

开始寻找问题根源

咦?难道是我哪里写错,我的第一反应是我的 xml 配置文件哪里写错了,我开始检查下面几个点:

  1. XML 文件是否与 Mapper 代码在通过一个包中。
  2. XML 配置文件文件名是否与 Mapper 代码文件名相同。(在使用 <package> 设置 mapper 配置文件位置时,必须要保证第一点和第二点)
  3. Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同。
  4. Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同 。
  5. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同。
  6. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同。

检查完成后,我发现都没有问题,那就奇怪了,这问题到底出在哪了呢?此时我看来一下编译后的目标文件夹中,发现我的 mapper 配置文件并没有被编译进去。
MyBatis 抛出 BindingException 异常可能是你忘了配置资源拷贝
原来在典型的 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 相同包下的文件合并到同一包中。
MyBatis 抛出 BindingException 异常可能是你忘了配置资源拷贝

方式二:更改 Maven 的构建配置

我们需要在 Maven 项目的 pom.xml 文件中配置下列代码:

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

采用上述方法中任意一个,然后重新运行测试代码,BindingException 异常的问题就解决了。

暂无评论

暂无评论...