如何使用Spring Cloud Netflix Feign设置自定义Jackson ObjectMapper

New*_*bie 8 spring spring-mvc spring-cloud feign spring-cloud-netflix

我遇到了需要为第三方API定义一次性@FeignClient的场景.在这个客户端中,我想使用与我的@Primary不同的自定义Jackson ObjectMapper.我知道可以覆盖spring的feign配置默认值,但是我不清楚如何只是通过这个特定的客户端简单地覆盖ObjectMapper.

New*_*bie 23

根据文档,您可以为您的Feign客户端提供自定义解码器,如下所示.

假设客户端界面:

@FeignClient(value = "foo", configuration = FooClientConfig.class)
public interface FooClient{
    //Your mappings
}
Run Code Online (Sandbox Code Playgroud)

Feign客户端自定义配置:

@Configuration
public class FooClientConfig {

    @Bean
    public Decoder feignDecoder() {
        HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());
        ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);
        return new ResponseEntityDecoder(new SpringDecoder(objectFactory));
    }

    public ObjectMapper customObjectMapper(){
        ObjectMapper objectMapper = new ObjectMapper();
        //Customize as much as you want
        return objectMapper;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只需使用`return new JacksonDecoder(customObjectMapper());`就可以为我工作 (4认同)

sui*_*eng 6

按照@NewBie 的回答,我可以给出更好的...

  @Bean
  public Decoder feignDecoder() {
    return new JacksonDecoder();
  }
Run Code Online (Sandbox Code Playgroud)

如果你想在 feign client 中使用 jackson 消息转换器,请使用 JacksonDecoder,因为 SpringDecoder 会增加生产中 feignclient 调用的平均延迟。

    <!-- feign-jackson decoder -->
    <dependency>
      <groupId>io.github.openfeign</groupId>
      <artifactId>feign-jackson</artifactId>
      <version>10.1.0</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)