Spring Cloud Feign Jackson自定义配置

来源:互联网 发布:matlab中文版 mac 编辑:程序博客网 时间:2024/05/16 19:20

Spring Cloud Feign 默认支持Spring MVC的注解 使用相同的HttpMessageConverters类转换

官方文档说明:

Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. 
但是我们一般在返回给前端JSON格式的时候 都会把相应的 NULL值转为相应的"",这使得Spring Cloud Feign也使用相同的Jackson配置,例如我们项目的配置

@Beanpublic ObjectMapper jacksonObjectMapper() {ObjectMapper objectMapper = new ObjectMapper();// objectMapper.setSerializationInclusion(Include.NON_NULL);objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {@Overridepublic void serialize(Object value, JsonGenerator jg, SerializerProvider sp)throws IOException, JsonProcessingException {jg.writeString("");sp.getDefaultNullKeySerializer();}});objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);return objectMapper;}
出现的问题:

在服务通过Feign进行请求的时候,传NULL值引用类型值时,会出现类型转换异常,由于HttpMessageConverters直接把NULL转为了""。

解决思路:
自定义配置 Spring Cloud Feign  Encoder与Decoder

官方文档说明:

Spring Cloud Netflix provides the following beans by default for feign (BeanType beanName: ClassName):Decoder feignDecoder: ResponseEntityDecoder (which wraps a SpringDecoder)Encoder feignEncoder: SpringEncoderLogger feignLogger: Slf4jLoggerContract feignContract: SpringMvcContractFeign.Builder feignBuilder: HystrixFeign.BuilderClient feignClient: if Ribbon is enabled it is a LoadBalancerFeignClient, otherwise the default feign client is used.
解决方法:
统一配置Feign 的Encoder和Decoder的Jackson转换方式

@Configurationpublic class CustomFeignConfig {    @Bean    public Decoder feignDecoder() {        HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());        ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);        return new ResponseEntityDecoder(new SpringDecoder(objectFactory));    }    @Bean    public Encoder feignEncoder(){        HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());        ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);        return new SpringEncoder(objectFactory);    }    public ObjectMapper customObjectMapper(){        ObjectMapper objectMapper = new ObjectMapper();        //Customize as much as you want        objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);        return objectMapper;    }}
原创粉丝点击