SpringBoot单例Bean实例重复导致应用启动失败求助
环境配置
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

