如何解决MyBatis中demoMapper Bean名称冲突错误?
我遇到一个反复出现的错误,急需解决办法。我有一个名为demoMapper的Mapper接口,并且已经手动配置MyBatis在项目启动时初始化Bean文件,但出现了如下错误:
Annotation-specified bean name 'demoMapper' for bean class [com.example.demo.repository.mapper.DemoMapper] conflicts with existing, non-compatible bean definition of same name and class
我尝试创建了MyBatisConfig配置文件,代码如下:
package com.example.demo.config; @Configuration public class MyBatisConfig { private final SqlSessionFactory sqlSessionFactory; public MyBatisConfig(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Bean public MapperFactoryBean<DemoMapper> demoMapper() { MapperFactoryBean<DemoMapper> factoryBean = new MapperFactoryBean<>(DemoMapper.class); factoryBean.setSqlSessionFactory(sqlSessionFactory); return factoryBean; } }
错误核心是Spring容器里重复创建了同名同类型的demoMapper Bean,通常是同时用了两种Mapper注册方式导致的:
检查自动扫描配置
先确认项目启动类是否加了@MapperScan("com.example.demo.repository.mapper")注解,或者配置文件里是否开启了MyBatis的Mapper扫描路径。如果有,MyBatis会自动把DemoMapper接口注册为Spring Bean,和你手动通过MapperFactoryBean创建的Bean冲突。二选一解决
方案1:删掉MyBatisConfig里的demoMapper()Bean方法,保留@MapperScan自动扫描——这是MyBatis整合SpringBoot的标准写法,更简洁。
方案2:如果必须手动配置,就删除启动类上的@MapperScan注解,同时确保配置文件里没开Mapper自动扫描,只保留手动配置的MapperFactoryBean。额外排查
确认DemoMapper接口上没加@Mapper注解,这个注解也会触发MyBatis自动注册Bean,和手动配置冲突。
内容的提问来源于stack exchange,提问作者Chilekesha Kasoka

