Java Spring Boot应用程序";bean类的bean名称与现有的“冲突”如何从第三方库/依赖项中排除包/类?

Java Spring Boot应用程序";bean类的bean名称与现有的“冲突”如何从第三方库/依赖项中排除包/类?,java,spring,spring-boot,applicationcontext,spring-bean,Java,Spring,Spring Boot,Applicationcontext,Spring Bean,我有一个SpringBoot应用程序,我最近从1.x.x迁移到了2.x.x。我正在使用一些第三方库/JAR来使用Prometheus记录度量 问题是我有(2)个名为PrometheusServletAutoConfiguration的Java类,它们都用@Configuration注释,我得到了臭名昭著的Spring异常: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-s

我有一个SpringBoot应用程序,我最近从1.x.x迁移到了2.x.x。我正在使用一些第三方库/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,但失败了。这完全让我困惑,我查看了IntelliJ中的代码/库,Spring1.x.x脱离了旧的分支代码,这个异常从未抛出过(它在Spring1.x.x中被忽略了吗?)。我还将注意到代码编译良好,但在运行时失败(有意义)

这是最好的解决方案吗?我是否应该告诉Spring不要扫描其中一个类FQDN,这样它就只能在应用程序上下文中创建一个bean?请记住,这些是我无法编辑的第三方LIB


我在包含main方法的Java类上使用
@springboot应用程序

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

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

@Configuration("myPrometheusServletAutoConfig")
public class PrometheusServletAutoConfiguration {

相关:

这应该是一个评论,但对于这样的评论来说太长了

我还没有测试过这个(如果它不起作用,我会删除这个答案),但是你能试试吗?你可以

// 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();
}

然后运行您的应用程序。

@M A这是一个遗留应用程序,两个名称冲突的类是依赖项-如果它是一个外部JAR被拉到我的项目中,我真的可以像您所说的那样覆盖它吗?@ennth您真的需要两者吗?如果没有,你可以排除其中一个:这是一个有趣的问题,很遗憾你从来没有回来说我的回答是否对你有用。