【问题标题】:How to resolve this conflicting of two beans with same name in maven project?如何解决maven项目中两个同名bean的冲突?
【发布时间】:2021-06-11 06:33:22
【问题描述】:

假设我有一个 Maven 项目 A 和项目 B,而项目 B 我将它作为一个 jar 添加到项目 A 中,当我尝试运行项目 A 时,它给了我错误“bean name “xyz”冲突具有相同名称和类的现有不兼容 bean 定义"

所以任何人都有解决方案来忽略项目 B 的 bean“xyz”并只运行项目 A 的“xyz”bean,或者是否有任何注释或类似的东西?

【问题讨论】:

  • 遇到这种情况有点代码味道。也许是时候考虑重构了?
  • 在项目 B 的 bean "xyz" 上使用 @Lazy 可能是一种方法?
  • @NielsBechNielsen 实际上我已经创建了带有 jersey 原型的 maven 项目,因此项目 A 和 B 都包含相同的 Jersey 配置文件,..其默认创建的类。这就是为什么。现在你能建议我一些可行的方法吗?

标签: java spring maven


【解决方案1】:

在配置类的bean定义上使用@Primary注解

@Bean(name = "beanOnA")
@Primary
public YourInterface yourBeanOnProjectA(){
    return new YourClass("Bean on Project A");
}

在自动装配 bean 时,使用限定符注解指定 bean 名称。

@Autowired
@Qualifier("beanOnA")
YourInterface yourInterface;

【讨论】:

    【解决方案2】:

    您可以使用限定符注解来实现这一点。

    @Qualifier("ProjectA")
    
    or
    
    @Qualifier("complete.package.ProjectA")
    

    【讨论】:

      【解决方案3】:

      在类文件中使用限定符注解。 例如 -

      @Autowired @Qualifier("ProjectA")
      

      【讨论】:

      • 你的意思是@Autowired @Qualifier("xyz") ???因为它的 bean 或类是冲突的。而且我没有xml文件..只有pom xml..我使用带有注释的java
      • 对不起,我的错,你必须把它放在类文件中,注释一个错字
      • 没关系,感谢您的快速回复。但是在课堂上我需要写@Qualifier(xyz.class) ????
      • 不,你在哪里自动连接bean,你需要使用限定符
      • 好吧,我想你没有得到我的场景,让我为你重新定义它。你告诉我使用 QUALIFIER ..好吧,但事情是有一个 java 文件...... xyz.java 它也在项目 A 和项目 B 中......我正在将此 Porject B 作为 jar 并在项目中使用它的功能A. 那时我遇到了 xyz.java 文件的错误冲突..但我想使用项目 A 的 xyz.java 来工作。而不是项目 B..如何做到这一点?
      【解决方案4】:

      在打包enter link description here时可以编辑B的pom文件以排除类文件

      使用 shade 插件编辑 pom 文件 A 以从 B 中排除类文件,enter link description here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多