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

Spring Boot MyBatis Plus 版本兼容问题(记录)

Spring Boot & MyBatis Plus 版本兼容问题(Invalid value type for attribute 'factoryBeanObjectType': java.lang.String)

  • 问题描述
  • 问题排查
    • 1. 检查 `@MapperScan` 的路径
    • 2. 项目中没有配置 `FactoryBean`
    • 3. 检查 `Spring` 和 `MyBatis Plus` 版本兼容性
  • 解决方法

问题描述

当使用 spring-boot-starter-parent v3.2.0 以上版本;mybatis-plus-boot-starter 3.5.10 时,如:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.0</version><relativePath/> <!-- lookup parent from repository -->
</parent><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.10</version>
</dependency>

会出现以下错误:

Invalid value type for attribute 'factoryBeanObjectType': java.lang.String

错误详情:

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'userMapper' defined in file [/Volumes/Macintosh/Workspace/Michael/michael-spica-mybatis-plus/target/classes/michael/spica/mybatis/plus/mapper/UserMapper.class]: Invalid value type for attribute 'factoryBeanObjectType': java.lang.Stringat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:858) ~[spring-beans-6.2.1.jar:6.2.1]at org.springframework.beans.factory.support.AbstractBeanFactory.getType(AbstractBeanFactory.java:742) ~[spring-beans-6.2.1.jar:6.2.1]at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAnnotationOnBean(DefaultListableBeanFactory.java:765) ~[spring-beans-6.2.1.jar:6.2.1]at org.springframework.boot.sql.init.dependency.AnnotationDependsOnDatabaseInitializationDetector.detect(AnnotationDependsOnDatabaseInitializationDetector.java:36) ~[spring-boot-3.4.1.jar:3.4.1]at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.detectDependsOnInitializationBeanNames(DatabaseInitializationDependencyConfigurer.java:152) ~[spring-boot-3.4.1.jar:3.4.1]at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.postProcessBeanFactory(DatabaseInitializationDependencyConfigurer.java:115) ~[spring-boot-3.4.1.jar:3.4.1]at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:363) ~[spring-context-6.2.1.jar:6.2.1]at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:197) ~[spring-context-6.2.1.jar:6.2.1]at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:791) ~[spring-context-6.2.1.jar:6.2.1]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:609) ~[spring-context-6.2.1.jar:6.2.1]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.4.1.jar:3.4.1]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.4.1.jar:3.4.1]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.4.1.jar:3.4.1]at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.4.1.jar:3.4.1]at michael.spica.mybatis.plus.MichaelSpicaMybatisPlusApplication.main(MichaelSpicaMybatisPlusApplication.java:42) ~[classes/:na]

问题排查

1. 检查 @MapperScan 的路径

@MapperScan 注解中提供的包路径正确,并且能够扫描到 UserMapper 类;路径不正确可能导致 Spring 不能正确地创建和管理 Mapper Bean。

@SpringBootApplication
@MapperScan("michael.spica.mybatis.plus.mapper")
public class MichaelSpicaMybatisPlusApplication {public static void main(String[] args) {SpringApplication.run(MichaelSpicaMybatisPlusApplication.class, args);}
}

2. 项目中没有配置 FactoryBean

从错误信息来看,factoryBeanObjectType 设置为了 String 类型,而应该是 Class 类型。

MyBatis 会自动生成 Mapper 接口的代理实现对象,而你不应该手动配置 FactoryBean

@Bean
public MapperFactoryBean<UserMapper> userMapper() {MapperFactoryBean<UserMapper> factoryBean = new MapperFactoryBean<>(UserMapper.class);factoryBean.setFactoryBeanObjectType(String.class);  // 错误配置,应该使用 Class 类型return factoryBean;
}

上面的 setFactoryBeanObjectType(String.class) 是错误的配置,应该删除这段配置,让 MyBatis 自动处理 Mapper 的代理对象。

正确方式:
MyBatis 和 MyBatis Plus 会自动处理 Mapper 的代理,因此一般不需要手动配置 FactoryBean

3. 检查 SpringMyBatis Plus 版本兼容性

当使用的 Spring Boot 3.2.0+(含v3.2.0)MyBatis Plus 3.5.10 时,会出现错误;所以经排查,是 SpringMyBatis Plus 版本兼容性问题。

解决方法

降低 Spring Boot 的版本至 3.2.0 以下,如:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.12</version><relativePath/> <!-- lookup parent from repository -->
</parent>

即可解决问题 ~~

完整pom文件,如下:

<?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.1.12</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>michael.spica.mybatis.plus</groupId><artifactId>michael-spica-mybatis-plus</artifactId><version>0.0.1-SNAPSHOT</version><name>michael-spica-mybatis-plus</name><description>michael-spica-mybatis-plus</description><properties><java.version>17</java.version> <!-- 定义项目使用的JDK版本 --><encoding>UTF-8</encoding> <!-- 定义项目编码格式 --><project.build.sourceEncoding>${encoding}</project.build.sourceEncoding> <!-- 源代码的编码方式 --><project.reporting.outputEncoding>${encoding}</project.reporting.outputEncoding> <!-- 输出报告编码方式 --><skipTests>true</skipTests> <!-- mvn打包时,跳过所有的测试阶段(包括编译和执行);也可以这样设置,如:<maven.test.skip>true</maven.test.skip> --><maven.compiler.parameters>true</maven.compiler.parameters> <!-- 开启JDK参数 --><maven.compiler.source>${java.version}</maven.compiler.source> <!-- 设置JDK版本(即:配置 Maven 编译时使用的源代码的 Java 版本) --><maven.compiler.target>${java.version}</maven.compiler.target> <!-- 设置JDK版本(即:配置编译生成的字节码版本为指定的 Java 版本) --><maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss:SSS</maven.build.timestamp.format> <!-- 设置打包时间格式 --><!-- jars versione.g: <mybatis-plus.version>x.x.x</mybatis-plus.version>--><mybatis-plus.version>3.5.10</mybatis-plus.version><lombok.version>1.18.36</lombok.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><scope>provided</scope></dependency><!-- MySQL Connector Java--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version><scope>runtime</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.34</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version><configuration><source>${java.version}</source><target>${java.version}</target><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.4.1</version><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
http://www.lryc.cn/news/525205.html

相关文章:

  • 26. 【.NET 8 实战--孢子记账--从单体到微服务】--需求更新--用户注销、修改用户名、安全设置
  • 神经网络|(一)加权平均法,感知机和神经元
  • OpenHarmony OTA升级参考资料记录
  • 在 Kubernetes 上快速安装 KubeSphere v4.1.2
  • 【回忆迷宫——处理方法+DFS】
  • 华为OD机试真题---战场索敌
  • 计算机网络 (53)互联网使用的安全协议
  • c++算法贪心系列
  • 【Maui】注销用户,采用“手势”点击label弹窗选择
  • 智慧脚下生根,智能井盖监测终端引领城市安全新革命
  • Word2Vec如何优化从中间层到输出层的计算?
  • 第七篇:vue3 计算属性:computed
  • 搭建k8s集群
  • Android SystemUI——最近任务应用列表(十七)
  • java 根据前端传回的png图片数组,后端加水印加密码生成pdf,返回给前端
  • 《探秘鸿蒙Next:如何保障AI模型轻量化后多设备协同功能一致》
  • C语言二级
  • 隐私保护+性能优化,RyTuneX 让你的电脑更快更安全
  • rust学习-宏的定义与使用
  • 【学习总结|DAY032】后端Web实战:登录认证
  • leetcode 123. 买卖股票的最佳时机 III
  • Apache Tika 详解
  • ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认
  • Qt——界面优化
  • python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加
  • Spring MVC和Spring WebFlux的区别
  • Linux探秘坊-------4.进度条小程序
  • Llama 3:开源大模型的里程碑式突破
  • 计算机网络 (56)交互式音频/视频
  • STM32 GPIO工作模式