Spring boot本地运行正常,请求正常,打包后运行正常,但是请求报错:invalid bound statement (not found) 的问题

2023-11-05

Spring boot本地运行请求正常,打包后运行正常,但是请求报错:invalid bound statement not found 的问题

问题场景

这个问题发生在我准备将一个旧项目打包部署到服务器上的时候,在服务器上运行jar包后,访问接口返回500,检查服务器日志发现抛出了异常invalid bound statement (not found)

项目结构

项目主要框架为Spring boot 和 mybatis-plus , 代码放在src/main/java中的某个包下,而xml文件则存在在resources/Mapper文件夹下

初步分析

按照以往的经验来说,出现该问题是由于mybatis的xml文件与mapper接口类没有建立映射关系。
于是我就启动了本地项目进行测试,但是发现本地项目可以正常请求,正常调用sql语句,一下就给整蒙了…
接着我又做了以下几个操作:

  1. 检查xml文件中的namespace映射,发现是正确的(其实这一步由于本地IDE启动时正常的所以基本不会错)
  2. 检查打包文件是否包含了xml文件,结果是正常打包进去了的。
  3. 重新clean -> compile -> package 打包重新部署到服务器,重新请求 =》 抛出异常
  4. 在本地机器直接运行jar包,重新请求 =》抛出异常

在进行以上操作后,很奇怪,为什么本地和jar类相同,但是二者启动后的测试却不同,显而易见,这个问题肯定是与 jar包启动方式 有关。

接着踩坑

在网上用mybatis jar包等关键词搜索了一圈,没有找到相关的文章,于是开始自己寻找原因。
根据刚刚的测试,通过IDE直接运行main方法是可以正常访问的,而打包成jar包运行jar包则会失败。
那么就去查看了直接运行main方法 与 运行jar包的区别,后来得出结论:

在通过jar包启动项目时,如果你的静态资源都打包在jar包里,那么就需要注意路径大小写的问题,如果你的静态资源是在jar外部,那大小写是否敏感就的看你运行的操作系统了。

下面的文章对于两种启动方式的研究很详细,这里附上链接,可以自行查看一下。

参考文章:SpringBoot的静态文件资源文件名称大小写敏感问题研究

原因: 个人问题

根据上面的分析结果,将存放xml文件夹的目录名称Mapper中的大写字母改成小写就可以了。
但是,这时候我想到一个问题,难道文件名必须强制要求小写?这种要求似乎太过于严苛了,不是可以通过mapper-locations配置xml扫描路径么。

所以,我又去检查了项目中的xml扫描路径配置,结果发现忘记写了…采用的是mybatis-plus的默认扫描路径,即src/main/resources/mapper/*.xml。由于个人习惯也是放在这个目录下,但是当初创建文件夹时不小心把首字母大写了,后面发现能够运行也就没有去多想。

那么 总结下来,在我的项目中会导致出现本地IDE运行正常,打包jar包启动后mybatis的xml映射关系找不到invalid bound statement (not found)的原因有以下几点:

  1. 未配置mapper-loactions属性,采用了mybatis-plus默认的路径src/main/resources/mapper
  2. 存放xml文件的目录名为Mapper,首字母大写
  3. 本地IDE直接启动项目时,对于resources不区分大小写。对jar包启动项目时,对于resources路径区分大小写。

总结

还是个人经验不足,粗心大意,竟然忘记了配置mapper-locations,实际上通过mapper-locations属性是可以指定扫描任意目录中的Mapper.xml文件的,同时还阴差阳错的将xml文件放到了默认扫描路径下,并且把目录名首字母大写了,导致jar包启动时区分大小写时无法找到xml文件。不过还是有收获的,了解到了直接运行main方法以及jar包启动之间的区别,记录下来,提醒自己避免再犯这种错误。

需要保证xml文件在打包后成功打包进了jar包中。因为在解决问题的过程中发现许多人是出现了将xml文件放在java代码目录下导致打包时maven自动忽略的xml文件导致找不到xml文件的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring boot本地运行正常,请求正常,打包后运行正常,但是请求报错:invalid bound statement (not found) 的问题 的相关文章

  • 如何在 Openfire 中使用 smack

    你好 我计划开发一个可以连接到 gtalk facebook 等的聊天客户端 我决定将 smack API 与 openfire 一起使用 但我需要很少的指导来了解如何将它与 openfire 服务器一起使用 openfire 是否提供了基
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 无法在 C# 中反序列化 XML - 无法识别的元素“add”

    我有一个使用自定义部分进行配置的 C 应用程序 我将这部分 XML 定义为字符串 该字符串如下所示 var xml
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • Logback:SizeAndTimeBasedRollingPolicy 不遵守totalSizeCap

    我正在尝试以一种方式管理我的日志记录 一旦达到总累积大小限制或达到最大历史记录限制 我最旧的存档日志文件就会被删除 当使用SizeAndTimeBasedRollingPolicy在 Logback 1 1 7 中 滚动文件追加器将继续创建
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 创建上下文后将 jar 文件添加到 pyspark

    我正在笔记本上使用 pyspark 并且不处理 SparkSession 的创建 我需要加载一个包含一些我想在处理 rdd 时使用的函数的 jar 您可以使用 jars 轻松完成此操作 但在我的特定情况下我无法做到这一点 有没有办法访问sp
  • 虽然我的类已加载,但 Class.forName 抛出 ClassNotFoundException

    代码如下 它的作用是加载我放在主目录中的 jar 文件中的所有类 import java io File import java util jar JarFile import java util jar JarEntry import j
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从
  • try-with-resources 中出现死代码警告,但翻译后的 try-catch-finally 中没有出现死代码警告

    以下代码使用try 有资源 https docs oracle com javase specs jls se7 html jls 14 html jls 14 20 3Java 8 中引入的构造 偶尔抛出 方法被声明为抛出一个偶尔的异常
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • Android Studio 3.0正式版填坑之路

    Android Studio 3 0启动图 序言 总看别人的文章 今天尝试着自己来写一篇 在逛论坛时候 无意间发现Android Studio 3 0正式版本推送更新了 早听说AS 3 0添加了许多新功能 然后手贱迫不及待地想先睹为快 结果
  • FreeRTOS系列

    本文主要介绍如何在任务或中断中向队列发送消息或者从队列中接收消息 使用STM32CubeMX将FreeRTOS移植到工程中 创建两个任务以及两个消息队列 并开启两个中断 两个任务 Keyscan Task 读取按键的键值 并将键值发送到队列
  • JavaScript异步编程---同步模式、异步模式、回调函数

    概述 众所周知 当前主流的JavaScript环境都是以单线程模式去执行代码的 其原因和当时设计该语言的初衷有关系 最早这门语言就是运行在浏览器上的脚本语言 目的是为了实现页面上的动态交互 其核心就是dom操作 该点决定了他必须要使用单线程
  • protobuf详细介绍和使用

    一 protobuf初识 一 protocol buffers 是什么 protocol buffers 是一种灵活 高效 自动化机制的结构数据序列化方法 可类比 XML 但是比 XML 更小 更快 更为简单 你可以定义数据的结构 然后使用
  • ChatGPT帮你30秒生成大师销售文案『AI效率神器』

    一篇好的销售文案大家都应该知道其重要性 但是 想要撰写一篇好的销售文案也并不容易 尤其是对于新手来说 需要有一定的写作技巧和经验 但是现在有了ChatGPT就不用担心啦 即便你是个完完全全的菜鸟 也可以利用AI轻松快速的模仿出销售大师才能撰
  • Git教程 - 如何新建干净的分支?(不基于其他分支)

    背景 分支整理 想要在原有GIT项目上创建一个新分支 但从浏览器端操作 发现都必须要基于其他分支创建 这样的话 新分支会包含旧分支的代码和历史提交信息 这里想创建一个空白的分支 尝试了以下方法解决 步骤 clone远程项目 git clon
  • Mybatis

    本文章根据尚硅谷在哔哩哔哩发布的视频的评论区中的网友 拂星星 提供的markdown文档整理而来 1 Mybatis简介 1 1 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis 2010年6月这个项目由Apa
  • Vuforia——VuMark 的使用

    一 创建KEY就不详说了 二 创建VuMark图片 Download DataBase 将资源导入 unity 其中Gnerate VuMark用于下载供手机扫描的不同ID图片 三 将图中两个预制物拖入Hierarchy中 填入key 勾选
  • [激光原理与应用-51]:《激光焊接质量实时监测系统研究》-2-激光焊接及其物理现象

    目录 2 1 激光焊接过程概述 2 1 1 激光焊接的特点 2 1 2 焊接质量的影响因素 2 1 3 激光焊接热源模型 2 1 4 激光焊接技术的发展前景与面临的挑战 2 2 激光焊接中的小孔效应及光致等离子体 2 2 1 激光焊接中的小
  • 什么是「推荐系统」,有哪些主要的推荐方法?

    1 什么是推荐系统 什么是推荐系统 根据维基百科的定义 它是一种信息过滤系统 主要功能是预测用户对物品 的评分和偏好 这一定义回答了推荐系统的功能是过滤信息 连接用户和推送信息 将这一定义扩 展一下 推荐系统就是自动联系用户和物品的一种工具
  • Win7系统提示Windows Defender无法扫描选定的文件解决方法

    Win7 64位系统提示 Windows Defender无法扫描选定的文件 怎么办呢 使用Windows Defender扫描文件 结果弹出如下图窗口 该怎么解决呢 参考下文 一起来解决Win7系统提示 Windows Defender无
  • 好玩的人脸识别小软件

    好玩的人脸识别小软件 前言 使用教程 1 软件代码 2 使用步骤 致谢 前言 在毕业的小空闲里面 利用pyqt写了一个简单实现人脸检测的小软件 非常好玩 推荐给大家玩一下 主要是利用Retinaface和Facenet实现人脸识别的 这两个
  • 将jpg格式的图片转换成eps

    bmeps c fig1 jpg fig1 eps
  • Python爬虫数据提取方式——-selenium爬虫框架中的数据提取方式

    介绍 selenium测试框架在爬虫中的应用 网页中通过js渲染的数据 爬虫的解决办法 1 去静态源码中查找 2 抓包或者网络请求中 查看是否有类似与json的get请求 直接请求这个json的API拿到数据 3 使用phantomjs s
  • element-ui 改变一行的样式row-style

    element ui 改变一行的样式row style 在工作过程中需要改变elementui的row style 在百度上查了很久结果都是一样的 rowStyle row rowIndex if rowIndex 0 return col
  • 华为OD机试 - 事件推送(Python)

    题目描述 同一个数轴X上有两个点的集合A A1 A2 Am 和B B1 B2 Bn Ai和Bj均为正整数 A B已经按照从小到大排好序 A B均不为空 给定一个距离R 正整数 列出同时满足如下条件的所有 Ai Bj 数对 Ai lt Bj
  • LaTeX 排版常用技巧 - 逐渐积累

    1 箭头上的文字 你的文字 underrightarrow text 你的文字 你的文字 underrightarrow text 你的文字 更喜欢另一种方式 CPU stackr
  • 散列表查找成功和不成功时的平均查找长度

    已知散列表长度为13 散列函数为H key key 11 处理冲突的方法为线性探测法 请画出依次插入关键字 10 8 40 27 21 57 46 23 19 56 以后的散列表 并计算查找成功和不成功时的平均查找长度 解 散列表是哈希表的
  • 用Ajax实现不刷新页面修改内容

    趁今天有空 就学习了Ajax 在Ajax in action那本书里提到了SAjax 就去下来看看 果然功能强大 让编写Ajax代码变的很简单 于是就写了个 修改内容不刷新页面 的代码 这个功能在网上以前是到处看到 今天终于自己实现了个 代
  • Spring boot本地运行正常,请求正常,打包后运行正常,但是请求报错:invalid bound statement (not found) 的问题

    Spring boot本地运行请求正常 打包后运行正常 但是请求报错 invalid bound statement not found 的问题 问题场景 项目结构 初步分析 接着踩坑 原因 个人问题 总结 问题场景 这个问题发生在我准备将