You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringCloud集成Mybatis-Plus与Xstream时Bean定义冲突的解决方法

问题

项目集成SpringCloud Eureka与Mybatis-Plus后启动失败,抛出ConflictingBeanDefinitionException异常,具体栈信息如下:

org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'mapper' for bean class [com.thoughtworks.xstream.mapper.Mapper] conflicts with existing, non-compatible bean definition of same name and class [com.baomidou.mybatisplus.core.mapper.Mapper]
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:349) ~[spring-context-5.3.18.jar:5.3.18]
    at org.mybatis.spring.mapper.ClassPathMapperScanner.checkCandidate(ClassPathMapperScanner.java:310) ~[mybatis-spring-2.0.6.jar:2.0.6]
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:287) ~[spring-context-5.3.18.jar:5.3.18]
    at org.mybatis.spring.mapper.ClassPathMapperScanner.doScan(ClassPathMapperScanner.java:204) ~[mybatis-spring-2.0.6.jar:2.0.6]
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.scan(ClassPathBeanDefinitionScanner.java:254) ~[spring-context-5.3.18.jar:5.3.18]
    at org.mybatis.spring.mapper.MapperScannerConfigurer.postProcessBeanDefinitionRegistry(MapperScannerConfigurer.java:375) ~[mybatis-spring-2.0.6.jar:2.0.6]
    at io.choerodon.mybatis.spring.CommonMapperScannerConfigurer.postProcessBeanDefinitionRegistry(CommonMapperScannerConfigurer.java:79) ~[hzero-starter-mybatis-mapper-1.9.0.RELEASE.jar:1.9.0.RELEASE]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) ~[spring-context-5.3.18.jar:5.3.18]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:142) ~[spring-context-5.3.18.jar:5.3.18]
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) ~[spring-context-5.3.18.jar:5.3.18]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.18.jar:5.3.18]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.5.12.jar:2.5.12]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) [spring-boot-2.5.12.jar:2.5.12]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:448) [spring-boot-2.5.12.jar:2.5.12]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) [spring-boot-2.5.12.jar:2.5.12]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1365) [spring-boot-2.5.12.jar:2.5.12]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) [spring-boot-2.5.12.jar:2.5.12]
    at com.anker.ipd.basis.IPDBasisApplication.main(IPDBasisApplication.java:23) [classes/:na]

已通过mvn dependency:tree排查依赖冲突,寻求解决方法。

解决方法

1. 精准限定Mapper扫描路径

异常核心原因是MyBatis的Mapper扫描器误扫到XStream的Mapper类,导致Bean命名冲突。需明确指定扫描范围:

  • 注解配置:在启动类的@MapperScan中指定项目自身的Mapper包路径,如@MapperScan("com.anker.ipd.basis.mapper"),避免使用com这类宽泛根包。
  • XML配置:在MapperScannerConfigurer中设置basePackage为项目Mapper所在的具体包。

2. 排除XStream冲突依赖

若项目无需XStream组件,通过mvn dependency:tree定位引入XStream的依赖,在Maven中排除该模块:

<dependency>
    <!-- 替换为实际引入XStream的依赖,比如SpringCloud Eureka相关依赖 -->
    <groupId>xxx</groupId>
    <artifactId>xxx</artifactId>
    <version>xxx</version>
    <exclusions>
        <exclusion>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3. 自定义Bean命名策略

修改MyBatis的Mapper扫描Bean命名规则,避免重名。自定义BeanNameGenerator给Mapper添加唯一前缀:

public class CustomMapperBeanNameGenerator extends DefaultBeanNameGenerator {
    @Override
    public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
        return "mybatisMapper_" + super.generateBeanName(definition, registry);
    }
}

在@MapperScan中指定该生成器:@MapperScan(basePackages = "com.anker.ipd.basis.mapper", nameGenerator = CustomMapperBeanNameGenerator.class)

4. 调整依赖版本兼容性

检查XStream与MyBatis-Plus、MyBatis-Spring的版本匹配度,尝试升级或降级其中一方版本。例如升级MyBatis-Spring至更高版本,新版本可能优化了扫描逻辑,减少冲突概率。

内容的提问来源于stack exchange,提问作者Junwen Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:05:10