SpringBoot整合MyBatis——Could not autowire.No beans of 'xxxMapper' type found.(期待网友共同编辑)

本文详细解析了在IDEA环境下使用SpringBoot整合MyBatis时遇到的常见问题,包括如何解决IDEA不编译xml文件导致的mapper注入失败,以及配置错误引发的各种异常。同时,提供了在不同IDEA版本下的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到这个问题困扰了我好几天,其实之前刚开始学习SpringBoot与MyBatis整合的时候,也遇到过这个问题。现在是第二次犯这个错误了,然而却不是明知故犯,是慢慢被自己坑进来的。让我们来看一下这个问题吧。可能总结的不是很全面,欢迎各位给我指出来,让解决该类问题的这篇博客变得更加详细起来,帮助更多的学习者解决该类问题,这就是写该博客的初衷

IDEA版本2018.2

首先,是IDEA本身的问题,我这个程序是可以正常运行起来的,而这个studentMapper的Bean是存在的,并且可以自动注入
在这里插入图片描述

所以有强迫症的可以网上查找,如何取消该红色的错误提示,这里就不提供方案了。

这是我的DAO的注解,注意我使用的是@Mapper,后面会讲解@Repository
在这里插入图片描述

这是我的启动类的扫面
在这里插入图片描述

第二种方式,使用@Repository,去除刚才的红色错误提示
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
使用@Repository后,发现红色错误提示没有了,所以本人现在比较推荐@Repository。

就因为这个错误使自己陷入了很多没必要的坑,但问题都是围绕这个bug的,因为一直纠结这个错误嘛,因为我们知道开发工具是不会有错误的,有错误的是程序员自己嘛!!!

紧接着就回到了我第一次遇到的问题,无法装配mapper的bean。而这个我之前是解决了的,只是用了书中作者的源码,而忽视了那个配置。

这个跟新版的idea有关,本人使用的版本是2018.2。由于新版的idea默认是不编译java下的xml文件的,由于程序员都习惯将mapper与xml放在同一个目录下而导致了无法编译xml,致使无法注入相关的Bean。而eclipse却可以这样做,所以使用idea开发的同志们就需要注意了。

在pom.xml中,添加如下配置

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

在这里插入图片描述

然后检查一下,target目录下是否有xml的编译文件,有的话则说明编译成功。

在这里插入图片描述
其他相关问题:
1.org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.test.springboot.dao.StudentMapper.insertStudent 无效绑定语句(未找到)
出现这个原因,需要检查下namespace的对应的dao的全限定名是否正确,我这里故意写少了一个 " r ",就报了这个错误。
在这里插入图片描述

假如,我的mybatis映射文件的扫描路径写错了,比如我这里缺少了个 “ r ”。也会报这个 “无效绑定语句(未找到)”。
在这里插入图片描述
2.假设我创建了一个相同的StudentMapper.xml,只是命名不同,但里面的内容完全是一样的,那又会报什么错误呢?
在这里插入图片描述

错误信息如下(这里截取关键的详细信息):

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘studentMapper’ defined in file…
Error creating bean with name ‘sqlSessionFactory’ defined in class path resource…
Failed to parse mapping resource. …
Error parsing Mapper XML…
Mapped Statements collection already contains value for com.test.springboot.dao.StudentMapper.getStudent…

这么一大堆错误,说白了,就是不知道映射到哪个映射文件,所以要确保映射文件的唯一性,否则找半天都不知道啥问题。

3.Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘studentMapper’ defined
Caused by: java.lang.IllegalArgumentException: Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required

另外,如果出现了这两个异常的话,建议检查下你的启动类上是否加了这句,如果加了,建议把它 删除 掉,否则会一直报上面的异常。我之前加这个的原因是因为找不到数据源的url。网上找到了这个解决的方案,结果加了这句后,错误是没了,但是报上面的异常的,让我不得不怀疑mapper的配置了,以致于一直在做无用功。
在这里插入图片描述

好了,基本总结如上所述,如果我的总结有错误的话,欢迎指出。假如上述的方案没有让您的问题解决的话,欢迎在下方给我留言,并且 提出您的类似问题或方案 ,让解决这类问题的本博客更加详尽,以帮助那些遇到该问题的朋友尽快解决问题

以下来自其他博友的方案:
1.感谢勾蟹博友
勾蟹:我的idea版本是2018.3,多模块SSM整合时也遇到这个问题,不过我的解决方案是Fire>project structure>Facets右一栏+号为当前项目或Modules添加Spring特征,然后在右二栏+号添加Application Context,为这个Context设置名称便于管理(可选),再看下面会出现当前项目或者Modules下的所有探测到的spring XML文件,为这个Context勾选应在同一上下文的XML,OK即可。 原理大概是告诉idea当前项目或Modules的spring context,当@Autowired注入mapper时,idea就会去这个上下文中查找,找不到就飘红线。

<think>问题:出现 "Could not autowire. No beans of 'IWaveTaskorderJuxinAdjustDao' type found." 错误。 原因:Spring容器中找不到类型为'IWaveTaskorderJuxinAdjustDao'的bean。 解决步骤: 1. 确保接口'IWaveTaskorderJuxinAdjustDao'被Spring扫描到: - 检查是否在接口上使用了@Mapper注解(如果使用Mybatis)或者使用了@Repository(如果使用其他方式,但通常Mybatis的Mapper接口不需要@Repository)。 - 如果使用Mybatis,通常使用@Mapper注解或者在配置类上使用@MapperScan指定扫描路径。 2. 检查包扫描配置: - 确保包含该接口的包在@ComponentScan或@MapperScan的扫描路径中。 3. 检查依赖注入方式: - 如果使用@Autowired,确保注入的字段、构造器或方法正确。 - 也可以考虑使用构造函数注入(推荐)或者setter注入。 4. 检查是否创建了该接口的实现类: - Mybatis会动态生成接口的代理类,所以不需要显式实现。但需要确保Mybatis的配置正确,比如mapper.xml文件存在且位置正确,或者在接口上使用注解配置SQL。 5. 检查Mybatis配置: - 在application.properties或application.yml中配置了mybatis.mapper-locations,指向mapper.xml文件的位置(如果使用XML方式)。 - 如果使用注解方式,确保SQL语句正确写在接口方法上。 6. 检查项目结构: - 确保接口在正确的包下,且包路径没有被排除在扫描之外。 示例代码: 在配置类上添加@MapperScan: ```java @Configuration @MapperScan("com.example.dao") // 替换为实际的包路径 public class MybatisConfig { } ``` 或者在接口上直接使用@Mapper: ```java @Mapper public interface IWaveTaskorderJuxinAdjustDao { // 方法定义 } ``` 7. 如果使用XML配置,确保XML文件在resources目录下对应的路径中,且文件名与接口名一致(或符合约定)。 8. 如果使用多数据源,需要确保该数据源的配置中包含了该Mapper的扫描。 9. 检查IDE是否正常编译:有时候IDE缓存问题可能导致,尝试清理并重新构建项目。 如果以上步骤都检查无误,应该就能解决该问题。</think>这个错误表明 Spring 框架无法找到类型为 `IWaveTaskorderJuxinAdjustDao` 的 Bean 进行自动注入。以下是完整解决方案: ### 问题原因分析 1. **未被 Spring 扫描**: - DAO 接口未被 Spring 扫描到(缺少 `@Mapper` 或未配置扫描路径) - 包含 DAO 的包不在组件扫描范围内 2. **配置问题**: - MyBatis 未正确配置(缺少 `@MapperScan`) - 多模块项目中包路径不一致 3. **实现缺失**: - 缺少 MyBatis 的 XML 映射文件或 SQL 注解 - 未生成代理实现类 ### 解决方案 #### 1. 添加注解扫描(推荐) ```java // 在 DAO 接口添加 @Mapper 注解 @Mapper public interface IWaveTaskorderJuxinAdjustDao { // 接口方法 } ``` #### 2. 配置全局扫描路径 ```java // 在启动类添加扫描配置 @SpringBootApplication @MapperScan("com.yourpackage.dao") // 替换为实际 DAO 包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 3. 检查 XML 映射文件 确保 `src/main/resources/mapper` 目录下有对应的 XML 文件: ```xml <!-- IWaveTaskorderJuxinAdjustDao.xml --> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.yourpackage.dao.IWaveTaskorderJuxinAdjustDao"> <!-- SQL 映射 --> </mapper> ``` #### 4. 验证项目结构 确保包结构符合扫描规则: ``` src ├── main │ ├── java │ │ └── com │ │ └── yourpackage │ │ ├── Application.java // 启动类 │ │ └── dao │ │ └── IWaveTaskorderJuxinAdjustDao.java // DAO接口 │ └── resources │ └── mapper │ └── IWaveTaskorderJuxinAdjustDao.xml // XML映射 ``` #### 5. 检查依赖配置 确保 `pom.xml` 包含必要依赖: ```xml <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis 集成 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> </dependencies> ``` ### 验证是否解决 在注入点添加 `@Autowired` 并检查是否仍有错误: ```java @Service public class YourService { @Autowired private IWaveTaskorderJuxinAdjustDao waveTaskorderDao; // 应无报错 // 业务方法 } ``` ### 常见问题排查 1. **多模块项目**:确保 DAO 模块已被主模块依赖 2. **包路径不一致**:检查 `@MapperScan` 路径与实际包路径是否完全匹配 3. **XML 文件位置**:在 `application.yml` 中配置映射路径: ```yaml mybatis: mapper-locations: classpath:mapper/**/*.xml ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值