自定义对象映射器 Bean 更改打开的 Feign 客户端/自动配置的对象映射器 Bean 的默认属性



我有 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

后者仅在上下文中没有手动创建的对象映射器时才创建默认ObjectMapperbean(请参阅相应方法@ConditionalOnMissingBean) - 在这种情况下,不同的 Bean 名称无关紧要。

因此,Feign 隐式依赖于这个自动配置的ObjectMapper但仅在您创建自己的之前。然后它开始使用你的。与许多其他春豆相同。

如果你真的需要拥有自己的ObjectMapperbean,那么你需要正确配置它。但是,您可以通过配置属性自定义自动配置的 - 请参阅文档。

最新更新