实践丨SpringBoot整合Mybatis-Plus项目存在Mapper时报错
摘要:在SpringBoot运行测试Mybatis-Plus测试的时候报错的问题分析与修复
本文分享自华为云社区《SpringBoot整合MybatisPlus项目存在Mapper时运行报错的问题分析与修复》,作者:攻城狮Chova 。
异常信息
- 在SpringBoot运行测试Mybatis-Plus测试的时候报错:
- rg.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.oxford.test.ApplicationTests':
原因
- 自定义的mapper文件不受Spring管理所以不会注入到Spring容器中
- mybatis-config中只是会为对应的mapper创建代理类
- 想真正包装成bean, 注入到spring容器中,需要使用到AutoConfiguredMapperScannerRegistrar它会根据扫描 @Mapper注释或是 @MapperScan指定的包下的接口,将其注册为bean
AutoConfiguredMapperScannerRegistrar:
- //
- // Source code recreated from a .class file by IntelliJ IDEA
- // (powered by Fernflower decompiler)
- //
- package com.baomidou.mybatisplus.spring.boot.starter;
- import com.baomidou.mybatisplus.MybatisConfiguration;
- import com.baomidou.mybatisplus.MybatisXMLLanguageDriver;
- import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
- import java.util.Iterator;
- import java.util.List;
- import javax.annotation.PostConstruct;
- import javax.sql.DataSource;
- import org.apache.ibatis.annotations.Mapper;
- import org.apache.ibatis.logging.Log;
- import org.apache.ibatis.logging.LogFactory;
- import org.apache.ibatis.mapping.DatabaseIdProvider;
- import org.apache.ibatis.plugin.Interceptor;
- import org.apache.ibatis.session.ExecutorType;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.mybatis.spring.SqlSessionTemplate;
- import org.mybatis.spring.mapper.ClassPathMapperScanner;
- import org.mybatis.spring.mapper.MapperFactoryBean;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.BeanFactory;
- import org.springframework.beans.factory.BeanFactoryAware;
- import org.springframework.beans.factory.ObjectProvider;
- import org.springframework.beans.factory.support.BeanDefinitionRegistry;
- import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
- import org.springframework.boot.autoconfigure.AutoConfigureAfter;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
- import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
- import org.springframework.boot.context.properties.EnableConfigurationProperties;
- import org.springframework.context.ResourceLoaderAware;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.context.annotation.Import;
- import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
- import org.springframework.core.io.Resource;
- import org.springframework.core.io.ResourceLoader;
- import org.springframework.core.type.AnnotationMetadata;
- import org.springframework.util.Assert;
- import org.springframework.util.CollectionUtils;
- import org.springframework.util.ObjectUtils;
- import org.springframework.util.StringUtils;
- @Configuration
- @ConditionalOnClass({SqlSessionFactory.class, MybatisSqlSessionFactoryBean.class})
- @ConditionalOnBean({DataSource.class})
- @EnableConfigurationProperties({MybatisPlusProperties.class})
- @AutoConfigureAfter({DataSourceAutoConfiguration.class})
- public class MybatisPlusAutoConfiguration {
- private static final Log logger = LogFactory.getLog(MybatisPlusAutoConfiguration.class);
- private final MybatisPlusProperties properties;
- private final Interceptor[] interceptors;
- private final ResourceLoader resourceLoader;
- private final DatabaseIdProvider databaseIdProvider;
- private final List<ConfigurationCustomizer> configurationCustomizers;
- public MybatisPlusAutoConfiguration(MybatisPlusProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider, ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider, ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) {
- this.properties = properties;
- this.interceptors = (Interceptor[])interceptorsProvider.getIfAvailable();
- this.resourceLoader = resourceLoader;
- this.databaseIdProvider = (DatabaseIdProvider)databaseIdProvider.getIfAvailable();
- this.configurationCustomizers = (List)configurationCustomizersProvider.getIfAvailable();
- }
- @PostConstruct
- public void checkConfigFileExists() {
- if (this.properties.isCheckConfigLocation() && StringUtils.hasText(this.properties.getConfigLocation())) {
- Resource resource = this.resourceLoader.getResource(this.properties.getConfigLocation());
- Assert.state(resource.exists(), "Cannot find config location: " + resource + " (please add config file or check your Mybatis configuration)");
- }
- }
- @Bean
- @ConditionalOnMissingBean
- public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
- MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
- factory.setDataSource(dataSource);
- factory.setVfs(SpringBootVFS.class);
- if (StringUtils.hasText(this.properties.getConfigLocation())) {
- factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
- }
- MybatisConfiguration configuration = this.properties.getConfiguration();
- if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
- configuration = new MybatisConfiguration();
- }
- if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
- Iterator i$ = this.configurationCustomizers.iterator();
- while(i$.hasNext()) {
- ConfigurationCustomizer customizer = (ConfigurationCustomizer)i$.next();
- customizer.customize(configuration);
- }
- }
- configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
- factory.setConfiguration(configuration);
- if (this.properties.getConfigurationProperties() != null) {
- factory.setConfigurationProperties(this.properties.getConfigurationProperties());
- }
- if (!ObjectUtils.isEmpty(this.interceptors)) {
- factory.setPlugins(this.interceptors);
- }
- if (this.databaseIdProvider != null) {
- factory.setDatabaseIdProvider(this.databaseIdProvider);
- }
- if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
- factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
- }
- if (StringUtils.hasLength(this.properties.getTypeEnumsPackage())) {
- factory.setTypeEnumsPackage(this.properties.getTypeEnumsPackage());
- }
- if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
- factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
- }
- if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
- factory.setMapperLocations(this.properties.resolveMapperLocations());
- }
- if (!ObjectUtils.isEmpty(this.properties.getGlobalConfig())) {
- factory.setGlobalConfig(this.properties.getGlobalConfig().convertGlobalConfiguration());
- }
- return factory.getObject();
- }
- @Bean
- @ConditionalOnMissingBean
- public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
- ExecutorType executorType = this.properties.getExecutorType();
- return executorType != null ? new SqlSessionTemplate(sqlSessionFactory, executorType) : new SqlSessionTemplate(sqlSessionFactory);
- }
- @Configuration
- @Import({MybatisPlusAutoConfiguration.AutoConfiguredMapperScannerRegistrar.class})
- @ConditionalOnMissingBean({MapperFactoryBean.class})
- public static class MapperScannerRegistrarNotFoundConfiguration {
- public MapperScannerRegistrarNotFoundConfiguration() {
- }
- @PostConstruct
- public void afterPropertiesSet() {
- MybatisPlusAutoConfiguration.logger.debug("No " + MapperFactoryBean.class.getName() + " found.");
- }
- }
- public static class AutoConfiguredMapperScannerRegistrar implements BeanFactoryAware, ImportBeanDefinitionRegistrar, ResourceLoaderAware {
- private BeanFactory beanFactory;
- private ResourceLoader resourceLoader;
- public AutoConfiguredMapperScannerRegistrar() {
- }
- public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
- MybatisPlusAutoConfiguration.logger.debug("Searching for mappers annotated with @Mapper");
- ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
- try {
- if (this.resourceLoader != null) {
- scanner.setResourceLoader(this.resourceLoader);
- }
- List<String> packages = AutoConfigurationPackages.get(this.beanFactory);
- if (MybatisPlusAutoConfiguration.logger.isDebugEnabled()) {
- Iterator i$ = packages.iterator();
- while(i$.hasNext()) {
- String pkg = (String)i$.next();
- MybatisPlusAutoConfiguration.logger.debug("Using auto-configuration base package '" + pkg + "'");
- }
- }
- scanner.setAnnotationClass(Mapper.class);
- scanner.registerFilters();
- scanner.doScan(StringUtils.toStringArray(packages));
- } catch (IllegalStateException var7) {
- MybatisPlusAutoConfiguration.logger.debug("Could not determine auto-configuration package, automatic mapper scanning disabled." + var7);
- }
- }
- public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
- this.beanFactory = beanFactory;
- }
- public void setResourceLoader(ResourceLoader resourceLoader) {
- this.resourceLoader = resourceLoader;
- }
- }
- }
解决办法
@Mapper
- 在mapper文件的类上添加 @Mapper注解
@MapperScan
- 在主类上添加 @MapperScan注解,指定mapper的扫描范围,注意值为mapper文件所在的包名
- @MapperScan("com.oxford.mapper")
实践丨SpringBoot整合Mybatis-Plus项目存在Mapper时报错的更多相关文章
- SpringBoot整合Mybatis之项目结构、数据源
已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...
- springboot 测试类,项目使用shiro时报错UnavailableSecurityManagerException
大概的问题就是,正常运行项目是没有问题的 使用测试类是,加载不了shiro的securityManager,主要导致不是很清楚,望告知, 解决方法 @Resource org.apache.shiro ...
- springboot整合mybatis源码分析
springboot整合mybatis源码分析 本文主要讲述mybatis在springboot中是如何被加载执行的,由于涉及的内容会比较多,所以这次只会对调用关系及关键代码点进行讲解,为了避免文章太 ...
- springBoot 整合 mybatis 项目实战
二.springBoot 整合 mybatis 项目实战 前言 上一篇文章开始了我们的springboot序篇,我们配置了mysql数据库,但是我们sql语句直接写在controller中并且使用 ...
- 三、SpringBoot 整合mybatis 多数据源以及分库分表
前言 说实话,这章本来不打算讲的,因为配置多数据源的网上有很多类似的教程.但是最近因为项目要用到分库分表,所以让我研究一下看怎么实现.我想着上一篇博客讲了多环境的配置,不同的环境调用不同的数据库,那接 ...
- 【java框架】SpringBoot(7) -- SpringBoot整合MyBatis
1.整合MyBatis操作 前面一篇提到了SpringBoot整合基础的数据源JDBC.Druid操作,实际项目中更常用的还是MyBatis框架,而SpringBoot整合MyBatis进行CRUD也 ...
- SpringBoot整合Mybatis【非注解版】
接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 选择Spring Initializr,配置JDK版本 输入项目名 选择构建web项目所需的state ...
- springboot学习随笔(四):Springboot整合mybatis(含generator自动生成代码)
这章我们将通过springboot整合mybatis来操作数据库 以下内容分为两部分,一部分主要介绍generator自动生成代码,生成model.dao层接口.dao接口对应的sql配置文件 第一部 ...
- springBoot整合mybatis、jsp 或 HTML
springBoot整合mybatis.jsp Spring Boot的主要优点: 1: 为所有Spring开发者更快的入门: 2: 开箱即用,提供各种默认配置来简化项目配置: 3: 内嵌式容器 ...
随机推荐
- Linux基础:VLAN篇
一.二层基础知识 1.1 vlan介绍 本小节重点: vlan的含义 vlan的类型 交换机端口类型 vlan的不足 1.1.1 vlan的含义 局域网LAN的发展是VLAN产生的基础,因而先介绍一下 ...
- CentOS 7 下编译安装 4.14 内核
文章目录 rpm升级 编译升级 升级前 下载安装包 编译内核 更新启动引导 修改默认启动内核 重启之后验证 rpm升级 # rpm的方式升级内核 1.载入内核公钥 [root@localhost ~] ...
- c++ 文本处理
c++ 文本处理 1.使用sstream版本 (1)功能:截取第一列为1以后的数据,如下图,截取第5行(包括第5行)以后的数据,前面4行数据丢弃. (2)代码:textProc.cc #include ...
- kaptcha验证码参数设置
Constant 描述 默认值 kaptcha.border 图片边框,合法值:yes , no yes kaptcha.border.color 边框颜色,合法值: r,g,b (and optio ...
- [编译器]dev c++单步调试
一.dev c++调试崩溃的解决方案 1.点击"工具 -> 编译选项". 2.选择"编译器"选项卡,勾选"编译时加入以下命令",输入& ...
- ASP.NET Core 6框架揭秘实例演示[13]:日志的基本编程模式[上篇]
<诊断跟踪的几种基本编程方式>介绍了四种常用的诊断日志框架.其实除了微软提供的这些日志框架,还有很多第三方日志框架可供我们选择,比如Log4Net.NLog和Serilog 等.虽然这些框 ...
- maven配置本地仓库和远程仓库
配置本地仓库 修改maven安装目录下conf/settings.xml,也可以在idea配置中覆盖 <localRepository>E:\maven\MavenRepository&l ...
- mapreduce 中 groupingComparator 用法
groupingComparator是对reduce输入的数据进行分组,比如 public int compare(WritableComparable a, WritableComparable b ...
- C++ 部分函数
string库 1.size()与length() 字符串长,结果相同 string s; s.length(); //s.length()-1是最后一个字符的下标,而不是'\0' for(i=0;i ...
- ROS入门介绍
1.ROS版本介绍 ROS版本:(已经推出数十个版本) 2013 ------> Hydro 2014 ------> Indigo (对应Ubuntu14.04) (现在已经基本废弃) ...