解决第三方包中的bean冲突

时间:2016-04-23 18:17:22

标签: spring

我有一个应用程序,我们称之为MyApp。 build.gradle的示例如下所示:

compile group: 'com.example', name: 'library'
compile .. spring-heatoas ..

现在,这个library的工作方式是它希望主机给它一个类型为ObjectMapper的bean。它本身不定义ObjectMapper,因为它的配置对主机库完全开放。所以基本上,在主机MyApp中我有这个配置:

@Configuration
public class SpringConfig {
    @Bean
    public ObjectMapper objectMapper() { ... }
}

一切都很好并且有效,直到我有spring-hateos依赖。 spring-hateos定义了自己的ObjectMapper,其名称为_hal_objectMapper。因此,在添加它之后,我在两个bean之间发生冲突。我试过了:

@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public ObjectMapper objectMapper() { ... }

这不仅不起作用,但即使这样做,我猜它有可能破坏功能,因为主机应用程序无法再配置ObjectMapper。一个直接的解决方案显然是让library接受一个命名bean,然后在我的宿主应用程序中使用@Qualifier注释声明它。但是让公司范围内的图书馆改变(并且有一些类似的图书馆)将是一个巨大的痛苦。虽然我们正在考虑这个解决方案,有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

注释@Primary建议spring使用带注释的bean,如果有许多相同类型的bean可用。这可以解决您的问题。

您的代码应如下所示:

@Configuration
public class SpringConfig {
  @Bean
  @Primary
  public ObjectMapper objectMapper() { ... }

}

问题可能是现在,spring-hateos也使用了这个没有按预期配置的objectMapper。

完整的解决方案可以是创建子弹簧上下文。 仅适用于您的ObjectMapper和第三方bean,因此对于您的其余应用程序,objectMapper不可见。

如何完成此操作取决于您如何实例化第三方bean以及它将在何处使用。有了提供的信息,我无法更详细地描述。

你可以在这里找到一个好的条目: modularizing-configurations

(参见“嵌套@Configuration类”或搜索“child”)