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. 檢查 Spring
和 MyBatis Plus
版本兼容性
當使用的 Spring Boot 3.2.0+(含v3.2.0)
和 MyBatis Plus 3.5.10
時,會出現錯誤;所以經排查,是 Spring
和 MyBatis 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>