首页 > 解决方案 > Spring Boot 应用程序“bean 类的 bean 名称与现有冲突” - 如何从 3rd 方库/依赖项中排除包/类?

问题描述

我有一个 Spring Boot 应用程序,我最近从 1.xx 迁移到 2.xx 我正在使用一些 3rd 方库/JAR 来使用 Prometheus 记录一些指标。

问题是我有 (2) 个 Java 类PrometheusServletAutoConfiguration,它们都带有注释,@Configuration并且我得到了臭名昭著的 Spring 异常:

org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'prometheusServletAutoConfiguration' for bean class [com.my.package.path1.PrometheusServletAutoConfiguration] conflicts with existing, non-compatible bean definition of same name and class [com.my.package.path2.PrometheusServletAutoConfiguration]

如您所见,它们的 FQDN 确实略有不同(完全限定的域名或包路径,正如您所看到的,我为本示例简化了它)但主类是相同的名称,所以我认为 Spring 正在尝试找出哪个Bean 创建和失败。这完全让我感到困惑,我查看了 IntelliJ 中的代码/库,使用 Spring 1.xx 关闭旧分支代码,并且从未抛出此异常(在 Spring 1.xx 中是否被忽略了?)。我还会注意到代码编译得很好,但在运行时失败(有道理)

是这里最好的分辨率吗?我是否应该告诉 Spring 不要扫描这些类 FQDN 之一,以便它只在应用程序上下文中创建 1 个 bean?请记住,这些是 我无法编辑的 3rd 方库。

我在@SpringBootApplication包含 main 方法的 Java 类上使用。

标签: javaspringspring-bootapplicationcontextspring-bean

解决方案


首先,PrometheusServletAutoConfiguration在应用程序中有两个类是一种代码味道,我首先会问自己为什么有两个类。理想的解决方案是拥有一个。

至于 Spring 的异常,可能是因为 Spring 自动检测到了注解的两个类@Configuration,并生成了两个同名的 bean(默认情况下,bean 名是根据类名计算出来的)。您可以覆盖其中一个类的 bean 名称:

@Configuration("myPrometheusServletAutoConfig")
public class PrometheusServletAutoConfiguration {

相关:注解指定的 bean 名称与现有的不兼容的 bean def 冲突


推荐阅读