我有几个spring-boot web应用程序和一个所有web应用程序都使用的集成库。集成库使用Spring进行DI,并定义了几个自己的ObjectMapper
,并指定了显式名称,特别是用于从API调用中执行自己的反序列化的CC_2。
下面是集成库中的ObjectMapper
bean定义(在@Configuration
类中):
@Bean(name = "Blah.APIObjectMapper")
public ObjectMapper blahAPIObjectMapper() {
ObjectMapper mapper = new ObjectMapper()
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
return mapper;
}
在库的其他地方,这个ObjectMapper
是@Autowired
与特定的@Qualifier
,如:
@Autowired
@Qualifier("Blah.APIObjectMapper")
private ObjectMapper blahAPIObjectMapper;
问题发生在web应用程序中。这个在集成库中定义的自定义ObjectMapper
bean与我无法控制的默认配置的ObjectMapper
bean冲突。
错误是:
org.springframework.beans.factory。UnsatisfiedDependencyException:错误创建bean名称'mappingJackson2HttpMessageConverter'定义在类路径资源[org/springframework/boot/autoconfigure/web/jacksonhttpmessageconverterconfiguration$ MappingJackson2HttpMessageConverterConfiguration.class]:不满意的依赖表示通过构造函数参数索引0类型[com.fasterxml.jackson.databind。ObjectMapper]::没有类型为[com.fasterxml.jackson.databind]的合格bean。ObjectMapper]被定义:期望的单个匹配bean,但发现2:blaha . apiobjectmapper,_halObjectMapper;嵌套异常是org.springframework.beans.factory.NoUniqueBeanDefinitionException: 没有类型为[com.fasterxml.杰克逊.databind]的合格bean。定义了ObjectMapper]:期望有一个匹配bean,但发现了2个:废话。APIObjectMapper, _halObjectMapper
Q:如何防止库的@Bean
0与春引导默认的ObjectMapper
冲突,显然命名为_halObjectMapper
?
我没有为Spring使用任何XML配置。
_halObjectMapper看起来像spring-hateoas通过@EnableHypermediaSupport创建的bean的名称。
如果存在多个objectMapper类型的bean, Spring引导接受名称为objectMapper的bean。因此,您可以通过创建名为objectMapper的第三个对象映射器bean来解决这个问题,甚至可以使用现有的objectMapper bean之一。
@Bean
public ObjectMapper objectMapper(ObjectMapper _halObjectMapper) {
return _halObjectMapper;
}
您可以将ObjectMapper bean定义为主要提供程序。这是一个例子。
@Primary
@Bean(name = "Blah.APIObjectMapper")
public ObjectMapper blahAPIObjectMapper() {
我通过交换Hateoas库解决了这个问题:
:
<dependency>
<groupId>org.springframework.hateoas</groupId>
<artifactId>spring-hateoas</artifactId>
</dependency>
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>