Spring Boot整合MyBatis Plus遇Bean注入与sqlSessionFactory缺失问题求助
问题描述
场景1:未使用@MapperScan注解时
启动项目抛出如下异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.reggie.mapper.EmployeeMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1812) ~[spring-beans-6.0.3.jar:6.0.3] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1371) ~[spring-beans-6.0.3.jar:6.0.3] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1325) ~[spring-beans-6.0.3.jar:6.0.3] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:709) ~[spring-beans-6.0.3.jar:6.0.3] ... 34 common frames omitted
场景2:添加@MapperScan注解后
异常变为:
Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required at org.springframework.util.Assert.notNull(Assert.java:204) ~[spring-core-6.0.3.jar:6.0.3] at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:122) ~[mybatis-spring-2.0.5.jar:2.0.5] at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:73) ~[mybatis-spring-2.0.5.jar:2.0.5] at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) ~[spring-tx-6.0.3.jar:6.0.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1797) ~[spring-beans-6.0.3.jar:6.0.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1747) ~[spring-beans-6.0.3.jar:6.0.3] ... 44 common frames omitted
相关代码与依赖
pom.xml依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>reggie</artifactId> <version>0.0.1-SNAPSHOT</version> <name>reggie</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.9</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>16</source> <target>16</target> </configuration> </plugin> </plugins> </build> </project>
Service接口
package com.example.reggie.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.reggie.entity.Employee; public interface EmployeeService extends IService<Employee> { }
Service实现类
package com.example.reggie.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.reggie.entity.Employee; import com.example.reggie.mapper.EmployeeMapper; import com.example.reggie.service.EmployeeService; import org.springframework.stereotype.Service; @Service public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService { }
Controller
package com.example.reggie.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.example.reggie.common.R; import com.example.reggie.entity.Employee; import com.example.reggie.service.EmployeeService; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.DigestUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @RequestMapping("/employee") public class EmplyeeController { @Autowired private EmployeeService employeeService; @PostMapping("/login") public R<Employee> login(HttpServletRequest request , @RequestBody Employee employee){ String password=employee.getPassword(); password=DigestUtils.md5DigestAsHex(password.getBytes()); LambdaQueryWrapper<Employee> queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.eq(Employee::getUsername,employee.getUsername()); Employee emp=employeeService.getOne(queryWrapper); if (emp==null){ return R.error("Failed"); } if (!emp.getPassword().equals(password)){ return R.error("Failed"); } if (emp.getStatus()==0){ return R.error("Forbidden."); } request.getSession().setAttribute("employee",emp.getId()); return R.success(emp); } }
问题成因与解决方案
核心原因:版本兼容性不匹配
你使用的Spring Boot 3.0.1属于Spring 6.x生态,而MyBatis-Plus 3.4.2依赖的MyBatis-Spring版本是2.0.5,这个版本仅支持Spring 5.x,完全不兼容Spring 6.x,这是导致两个异常的根本原因。
第一个异常(无@MapperScan时)
MyBatis-Plus的自动配置需要正确扫描Mapper接口生成代理Bean,但版本不兼容导致自动配置逻辑失效,Spring无法识别@Mapper注解(假设你的EmployeeMapper已添加该注解),也无法自动扫描Mapper包,因此找不到EmployeeMapper的Bean,引发依赖注入失败。
第二个异常(添加@MapperScan后)
手动添加@MapperScan后,Spring尝试创建Mapper代理Bean,但MyBatis-Spring 2.0.5无法适配Spring 6.x的Bean生命周期管理,也无法正确获取Spring Boot自动配置的SqlSessionFactory,因此抛出sqlSessionFactory或sqlSessionTemplate缺失的异常。
解决方案
步骤1:升级MyBatis-Plus到兼容Spring Boot 3.x的版本
MyBatis-Plus从3.5.3.1开始支持Spring Boot 3.x,修改pom.xml中的MyBatis-Plus依赖:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency>
步骤2:调整其他依赖版本(可选但建议)
- Druid 1.1.9版本较老,可升级到支持Spring Boot 3.x的版本:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.16</version> </dependency>
- commons-lang 2.1版本过时,替换为commons-lang3:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency>
- fastjson 1.2.12存在安全漏洞,升级到最新稳定版:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.42</version> </dependency>
步骤3:确保Mapper配置正确
- 在
EmployeeMapper接口上添加@Mapper注解,或在启动类上添加@MapperScan("com.example.reggie.mapper")(二选一即可)。 - 检查application.yml/application.properties中的数据库配置是否正确,确保Spring Boot能正常创建
SqlSessionFactory。
步骤4:修正编译插件配置
pom.xml中maven-compiler-plugin指定的source和target为16,但配置的java.version是17,统一修改为17:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>17</source> <target>17</target> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Jenkins Chen
相关产品推荐
相关产品推荐

