使用spring的库定义的bean与应用程序冲突



我有几个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:如何防止库的@Bean0与春引导默认的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>

最新更新