当前位置: 首页 > news >正文

Intelij IDEA中Mapper.xml无法构建到资源目录的问题

问题场景:

在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时,在配置文件均与eclipse一致的情况下出现了如下报错:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.settings.mapper.UserMapper.selectUserByAccandPwdat org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:229)at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53)at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:96)at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:36)at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:94)at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)at jdk.proxy4/jdk.proxy4.$Proxy38.selectUserByAccandPwd(Unknown Source)at cn.umbrella.crm_core.settings.service.impl.UserServiceImpl.queryUserByAccandPwd(UserServiceImpl.java:27)at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)at java.base/java.lang.reflect.Method.invoke(Method.java:580)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)...

问题描述

在eclipse中,我们的项目结构如图所示,即Mapper.xml跟Mapper接口都放在src/java目录下,项目部署tomcat后运行没有任何问题,但是到了IDEA中,项目就无法找到Mapper.xml文件,在反复确认了SpringMVC及MyBatis配置文件无误的情况下,问题仍然无法解决。

项目结构图

原因分析:

eclipse在编译项目时会按照applicationContext-datasource.xml中配置的Mapper扫描器对Mapper.xml进行扫描而Intelij IDEA不会,这其实是两者的Tomcat部署方式不同。也就是说默认情况下,eclipse是热部署,而IDEA不是,IDEA需要先用Maven将项目构建为war包,然后复制到Tomcat等webapps目录下才能运行,而这个构建过程中,由于src/main/java不是资源目录,所以mapper.xml不会被打包至target目录中。

eclipse配置tomcat时是本质上是映射了一个tomcat的镜像在.metadata的serer.core目录下,每创一个tomcat,就生成文件名为“tmp编号”的tomcat的映射文件,创建的镜像和源tomcat就没有关系,eclipse是通过这个镜像的tomcat去运行项目。
IDEA是先把项目进行构建打包,然后将war包复制到本地Tomcat的webapps目录下运行项目。
参照:Eclipse和IDEA配置Tomcat的区别


解决方案:

直接在src/main/resources目录下新建与src/main/java中mapper接口映射的目录,将mapper.xml文件转移至resources目录下,这样在applicationContext-datasource.xml中配置的Mapper扫描器地址可以不用改变。
调整后的项目结构

<!-- mapper注解扫描器配置,扫描@MapperScan注解,自动生成代码对象 --><bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="cn.umbrella.crm_core.settings.mapper, cn.umbrella.crm_core.workbench.mapper"/><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/></bean>

另外,还有大佬提供了其他的解决方案,就是在pom.xml中配置资源目录的方法,参照下面的链接:

  1. (完美解决汇总)org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
  2. org.apache.ibatis.binding.BindingException Invalidbound statement (not found)的解决方案和造成原因分析
http://www.lryc.cn/news/379255.html

相关文章:

  • 2024.6.23周报
  • 鸿蒙实战开发:网络层的艺术——优雅封装与搭建指南(中)
  • docker in docker 连私有仓库时报错 https
  • mac怎么压缩pdf文件,苹果电脑怎么压缩pdf文件大小
  • 兴顺物流管理系统的设计
  • 力扣(2024.06.21)
  • 飞机大战java
  • Springboot的自动配置原理
  • Interview preparation--elascitSearch深分页问题
  • C语言笔试题:实现把一个无符号整型数字的二进制序列反序后输出
  • elementplus如何实现dialog遮罩层外的元素可以被操作点击
  • Springboot整合Kafka消息队列服务实例
  • kotlin——MVVM框架下的大型项目优化
  • echarts实现折线图点击添加标记
  • 循环赛日程表
  • 计算机网络:运输层 - 概述
  • 使用阿里开源的Spring Cloud Alibaba AI开发第一个大模型应用
  • `THREE.PointsMaterial` 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。
  • Android-Android Studio-FAQ
  • 架构师指南:现代 Datalake 参考架构
  • 通讯协议大全(UART,RS485,SPI,IIC)
  • 基于EXCEL数据表格创建省份专题地图
  • 基于java+springboot+vue实现的电商应用系统(文末源码+Lw)241
  • 好文!12个策略解决 Kafka 数据丢失问题
  • Android 第三方框架:网络:OkHttp:源码分析:拦截器
  • FlowUs AI的使用教程和使用体验
  • SwiftUI 6.0(iOS 18)ScrollView 全新的滚动位置(ScrollPosition)揭秘
  • 阿贝云免费虚拟主机和免费云服务器评测
  • 不懂就问,开通小程序地理位置接口有那么难吗?
  • Python 全栈系列256 异步任务与队列消息控制(填坑)