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

SpringBoot单例Bean实例重复导致应用启动失败求助

问题:Spring Boot启动时出现NoUniqueBeanDefinitionException

环境配置

Gradle版本参数

buildscript {
    ext {
        /* Plugin versions */
        openApiGeneratorVersion = "6.6.0"
        openApiMergerPluginVersion = "1.0.5"
        aspectjPluginVersion = "8.0.1"
        springBootVersion = "2.5.15"
        springBootDependencyManagementVersion = "1.0.15.RELEASE"

        /* Jar versions */
        sshjVersion = "0.35.0"
        workflowEngineBuildType = "bora"
        workflowEngineVersion = "21917453"
        lombokVersion = "1.18.24"
        aspectjrtVersion = "1.9.19"
        swaggerCoreVersion = "2.2.12"
        junitVersion = "5.8.1"
    }
}

可执行Jar构建配置

bootJar {
    manifest {
        attributes 'Start-Class': 'com.xxx.xxx.xxx.StartClass'
    }
}

自定义Bean声明

@Component
public class VMForgeTopologyFacade implements VmForgeTopologyApiDelegate 

启动报错信息

2023-06-25 19:37:05.840 WARN 22817 --- [ main]
ConfigServletWebServerApplicationContext : Exception encountered
during context initialization - cancelling refresh attempt:
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'vmForgeTopologyApiController' defined
in URL
[jar:file:/Users/sagarg/vmware/vm-forge/build/libs/vmforge-0.1.jar!/BOOT-INF/lib/vm-forge-api-0.1.jar!/com/vmware/vmforge/api/VmForgeTopologyApiController.class]:
Unsatisfied dependency expressed through constructor parameter 0;
nested exception is
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No
qualifying bean of type
'com.vmware.vmforge.api.VmForgeTopologyApiDelegate' available:
expected single matching bean but found 2:
VMForgeTopologyFacade,com.vmware.vmforge.api.topology.facade.VMForgeTopologyFacade

*************************** APPLICATION FAILED TO START


Description:

Parameter 0 of constructor in
com.vmware.vmforge.api.VmForgeTopologyApiController required a single
bean, but 2 were found:

  • VMForgeTopologyFacade: defined in URL [jar:file:/Users/sagarg/vmware/vm-forge/build/libs/vmforge-0.1.jar!/BOOT-INF/lib/vm-forge-api-service-0.1.jar!/com/vmware/vmforge/api/topology/facade/VMForgeTopologyFacade.class]
  • com.vmware.vmforge.api.topology.facade.VMForgeTopologyFacade: defined in URL
    [jar:file:/Users/sagarg/vmware/vm-forge/build/libs/vmforge-0.1.jar!/BOOT-INF/lib/vm-forge-api-service-0.1.jar!/com/vmware/vmforge/api/topology/facade/VMForgeTopologyFacade.class]

已排查步骤

  • 尝试使用@Qualifier注解,问题未解决
  • 验证Jar包中不存在该类的两个实例
  • 验证类路径中无同名其他类

解决方案

从报错来看,同一个类com.vmware.vmforge.api.topology.facade.VMForgeTopologyFacade被Spring识别为两个不同名称的Bean(短类名和全限定类名),大概率是类被重复扫描或OpenAPI生成代码与自定义类冲突导致,可尝试以下方案:

方案1:显式指定Bean名称

在自定义类上明确指定Bean名称,避免Spring自动生成不同标识:

@Component("vmForgeTopologyFacade")
public class VMForgeTopologyFacade implements VmForgeTopologyApiDelegate 

同时在控制器构造参数上匹配该名称:

public class VmForgeTopologyApiController {
    private final VmForgeTopologyApiDelegate delegate;

    public VmForgeTopologyApiController(@Qualifier("vmForgeTopologyFacade") VmForgeTopologyApiDelegate delegate) {
        this.delegate = delegate;
    }
}

方案2:排除重复扫描路径

检查Spring组件扫描配置,确保目标包未被重复扫描。若使用@SpringBootApplication,可调整扫描范围或排除冲突类:

@SpringBootApplication(scanBasePackages = "com.vmware.vmforge", excludeFilters = {
    @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = com.vmware.vmforge.api.topology.facade.VMForgeTopologyFacade.class)
})

注意:需确保排除的是重复生成的类,保留自定义实现。

方案3:调整OpenAPI Generator配置

项目使用了OpenAPI Generator(6.6.0),可能生成了默认的VmForgeTopologyApiDelegate实现类,与自定义类冲突。修改Gradle插件配置,禁用默认Delegate生成:

openApiGenerate {
    generatorName = "spring"
    inputSpec = "$rootDir/src/main/resources/openapi.yaml".toString()
    outputDir = "$buildDir/generated/openapi".toString()
    apiPackage = "com.vmware.vmforge.api"
    modelPackage = "com.vmware.vmforge.api.model"
    configOptions = [
        delegatePattern: "false"
    ]
}

方案4:检查Jar依赖重复

确认vm-forge-api-service-0.1.jar未被重复引入,执行以下命令查看依赖树:

./gradlew dependencies

若发现重复依赖,在build.gradle中排除:

dependencies {
    implementation('com.vmware:vm-forge-api-service:0.1') {
        exclude group: 'com.vmware', module: 'vm-forge-api-service'
    }
}

内容的提问来源于stack exchange,提问作者Sagar Gandhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:14:54