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

发布于 2023-10-16 19:42:54 字数 2239 浏览 31 评论 0

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

开始寻找问题根源

咦?难道是我哪里写错,我的第一反应是我的 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 配置文件并没有被编译进去。

原来在典型的 maven 工程中,目录结构有: src/main/javasrc/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/javasrc/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 异常的问题就解决了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

南渊

暂无简介

0 文章
0 评论
21 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文