java - 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 类上使用。
解决方案
首先,PrometheusServletAutoConfiguration
在应用程序中有两个类是一种代码味道,我首先会问自己为什么有两个类。理想的解决方案是拥有一个。
至于 Spring 的异常,可能是因为 Spring 自动检测到了注解的两个类@Configuration
,并生成了两个同名的 bean(默认情况下,bean 名是根据类名计算出来的)。您可以覆盖其中一个类的 bean 名称:
@Configuration("myPrometheusServletAutoConfig")
public class PrometheusServletAutoConfiguration {
推荐阅读
- java - 详细说明:方法重载是静态/编译时绑定,但不是多态性。将静态绑定与多态性相关联是否正确?
- java - 网页在 Cordova Android 应用程序中不可用
- javascript - 在 HTML 中,如何在按钮中创建按钮
- javascript - 需要帮助将资产注入已编译的 index.html 文件
- google-cloud-storage - 将文件从 GCS 复制到 AWS S3 时如何设置 acl?
- javascript - JSON.parse 错误:位置 1 处的字符无效
- pandas - 使用 Pandas to_hdf 时,是否可以为不规则张量指定 vlen special_dtype / vlarray 的列数据类型?
- laravel - Uncaught SyntaxError: Unexpected identifier in import Echo from 'laravel-echo' js file present in resources/js/bootstrap.js
- for-loop - 如果有scanf,为什么在循环时会得到重复的输出?
- amazon-web-services - AWS VPC 终端节点接口是否需要 Internet 网关