当使用 spring-boot-starter-parent
v3.2.0
以上版本;mybatis-plus-boot-starter
3.5.10
时,如:
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>3.2.0version>
<relativePath/>
parent>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.5.10version>
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.String
at 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]
@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);
}
}
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
。
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.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>3.1.12version>
<relativePath/>
parent>
即可解决问题 ~~
完整pom文件,如下:
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>3.1.12version>
<relativePath/>
parent>
<groupId>michael.spica.mybatis.plusgroupId>
<artifactId>michael-spica-mybatis-plusartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>michael-spica-mybatis-plusname>
<description>michael-spica-mybatis-plusdescription>
<properties>
<java.version>17java.version>
<encoding>UTF-8encoding>
<project.build.sourceEncoding>${encoding}project.build.sourceEncoding>
<project.reporting.outputEncoding>${encoding}project.reporting.outputEncoding>
<skipTests>trueskipTests>
<maven.compiler.parameters>truemaven.compiler.parameters>
<maven.compiler.source>${java.version}maven.compiler.source>
<maven.compiler.target>${java.version}maven.compiler.target>
<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss:SSSmaven.build.timestamp.format>
<mybatis-plus.version>3.5.10mybatis-plus.version>
<lombok.version>1.18.36lombok.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok.version}version>
<scope>providedscope>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.33version>
<scope>runtimescope>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>${mybatis-plus.version}version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
<version>${mybatis-plus.version}version>
dependency>
<dependency>
<groupId>org.freemarkergroupId>
<artifactId>freemarkerartifactId>
<version>2.3.34version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.13.0version>
<configuration>
<source>${java.version}source>
<target>${java.version}target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok.version}version>
path>
annotationProcessorPaths>
configuration>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>3.4.1version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
plugins>
build>
project>