Пользовательский объектный маппер объекта, изменяющий свойства десериализации по умолчанию открытого Feign Client - PullRequest
1 голос
/ 08 апреля 2020

У меня есть открытые симулированные клиентские конфигурации Spring, подобные следующим:

public class AppFeignConfiguration
{
@Bean
public ErrorDecoder errorDecoder()
{
    return new FeignErrorDecoder();
}


@Bean
public Logger.Level logger()
{
    return Logger.Level.FULL;
}


@Bean
public Request.Options options()
{
    return new Request.Options( 30000, 30000 );
}
}

, и я предоставляю его как конфигурацию в @FeignClient как следующую

@FeignClient ( value = "apigateway-service", configuration = AppFeignConfiguration.class)

Я считаю, что FeignClient имеет конфигурацию по умолчанию для десериализации ответа (возможно, ObjectMapper с некоторыми свойствами).

Пока все хорошо. Все работало, как и ожидалось.

Затем я создал пользовательский объектный преобразователь и возвратил его в виде компонента, подобного следующему:

@Configuration
public class ObjectMapperConfig
{
  @Bean ( name = "plainObjectMapper")
  public ObjectMapper plainObjectMapper()
  {
      return new ObjectMapper();
  }
}

Теперь проблема в том, что это связано с десериализацией по умолчанию конфигурации FeignClient.

То есть без пользовательского plainObjectMapper он работал нормально, без ошибок синтаксического анализа json. Но после создания пользовательского plainObjectMapper в виде bean-компонента FeignClient выдает исключения, сообщающие о неизвестных свойствах или о чем-то.

nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unrecognized field "xyz" (class abc.def.ghi.class), not marked as ignorable; nested exception is com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException

Я подтвердил это, удалив пользовательский plainObjectMapper, и он работал нормально так же, как это раньше.

Это кажется странным! Я дал бобу собственное имя, которое не должно мешать бину, созданному springboot.

Как мне преодолеть этот конфликт?

1 Ответ

1 голос
/ 08 апреля 2020

Это не совсем правильно.

Если вы посмотрите на FeignClientsConfiguration source , вы увидите, что его кодировщики используют класс HttpMessageConverters.

Тогда HttpMessageConvertersAutoConfiguration ( source ) зависит от JacksonAutoConfiguration.

Последний создает бин ObjectMapper по умолчанию, только если в контексте нет созданного вручную сопоставителя объектов (см. @ConditionalOnMissingBean по соответствующему методу ) - другое имя бина не в данном случае имеет значение.

Итак, случается, что Feign неявно полагается на эту автоматически сконфигурированную ObjectMapper, но только до тех пор, пока вы не создадите свою собственную. Тогда он начинает использовать твой. То же самое со многими другими весенними бобами.

Если вам действительно нужен собственный боб ObjectMapper, то вам нужно правильно его настроить. Но вы можете настроить автоматически сконфигурированный вместо этого через свойства конфигурации - см. docs .

...