如何解决Spring Boot 应用程序“bean 类的 bean 名称与现有冲突”-如何从 3rd 方库/依赖项中排除包/类?
我有一个 Spring Boot 应用程序,我最近从 1.x.x 迁移到了 2.x.x。我正在使用一些 3rd 方库/JAR 来使用 Prometheus 记录一些指标。
问题是我有 (2) 个名为 PrometheusServletAutoConfiguration
的 Java 类,它们都用 @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。这让我很困惑,我在旧分支代码中查看了带有 Spring 1.xx 的 IntelliJ 中的代码/库,这个异常从未被抛出(它在 Spring 1.xx 中被忽略了吗? ?)。我也会注意到代码编译正常,但在运行时失败(有道理)
这里是最好的分辨率吗?我是否应该告诉 Spring 不要扫描这些类 FQDN 之一,这样它只会在应用程序上下文中创建 1 个 bean?请记住,这些是 我无法编辑的第 3 方库。
我在包含 main 方法的 Java 类上使用 @SpringBootApplication
。
解决方法
首先,在应用程序中有两个类 PrometheusServletAutoConfiguration
是一种代码味道,我首先会问自己为什么有两个类。理想的解决方案是拥有一个。
至于Spring异常,可能是因为Spring自动检测了@Configuration
注解的两个类,生成了两个同名的bean(默认bean名是根据类名计算出来的)。您可以覆盖其中一个类的 bean 名称:
@Configuration("myPrometheusServletAutoConfig")
public class PrometheusServletAutoConfiguration {
相关:Annotation-specified bean name conflicts with existing,non-compatible bean def
,这应该是一个评论,但对于这样的评论太长了。
我没有测试过这个(如果它不起作用,我会删除这个答案),但是你能试试吗?你可以做
// extend one of the configs
@Configuration(value = "myPrometheusServletAutoConfig")
public class CopyConfig extends com.my.package.path2.PrometheusServletAutoConfiguration {
}
然后定义一个BeanPostProcessor
:
public class MyPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean,String beanName) throws BeansException {
if(bean.getClass().equals(com.my.package.path2.PrometheusServletAutoConfiguration.class)){
return new CopyConfig();
}
return bean;
}
}
并在您的上下文中注册它:
@Bean
public MyPostProcessor customBeanFactory() {
return new MyPostProcessor();
}
然后运行您的应用程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。