我有 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)。
到目前为止一切都很好。一切都按预期工作。
然后,我创建了一个自定义对象映射器,并将其作为 Bean 返回,如下所示:
@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 创建的豆子混淆。
我怎样才能克服这种冲突?
这并不完全正确。
如果您查看FeignClientsConfiguration
源代码,您会发现它的编码器依赖于HttpMessageConverters
类。
然后,HttpMessageConvertersAutoConfiguration
(来源)本身取决于JacksonAutoConfiguration
。
后者仅在上下文中没有手动创建的对象映射器时才创建默认ObjectMapper
bean(请参阅相应方法@ConditionalOnMissingBean
) - 在这种情况下,不同的 Bean 名称无关紧要。
因此,Feign 隐式依赖于这个自动配置的ObjectMapper
但仅在您创建自己的之前。然后它开始使用你的。与许多其他春豆相同。
如果你真的需要拥有自己的ObjectMapper
bean,那么你需要正确配置它。但是,您可以通过配置属性自定义自动配置的 - 请参阅文档。