我有一个应用程序,我们称之为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
注释声明它。但是让公司范围内的图书馆改变(并且有一些类似的图书馆)将是一个巨大的痛苦。虽然我们正在考虑这个解决方案,有没有办法解决这个问题?
答案 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”)