修改Feign数据解析,由jackson改为fastjson,同时解决fastjson中Content-Type问题

 

https://my.oschina.net/u/3419586/blog/2964047

背景:
在用Feign Client 接口调用,由于jackson对null等特殊值处理存在异常,故改用fastjson解析数据

操作步骤:
1.增加文件FeignConfig,注入Bean,修改默认Feign默认的解析方式
2.由于fastjson1.2.28后,增加了对Content-type验证,故添加多种MediaType

@Configurationpublic class FeignConfig { @Bean public ResponseEntityDecoder feignDecoder() { HttpMessageConverter fastJsonConverter = createFastJsonConverter(); ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(fastJsonConverter); return new ResponseEntityDecoder(new SpringDecoder(objectFactory)); } @Bean public SpringEncoder feignEncoder(){ HttpMessageConverter fastJsonConverter = createFastJsonConverter(); ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(fastJsonConverter); return new SpringEncoder(objectFactory); } private HttpMessageConverter createFastJsonConverter() { //创建fastJson消息转换器 FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); //升级最新版本需加============================================================= List<MediaType> supportedMediaTypes = new ArrayList<>(); supportedMediaTypes.add(MediaType.APPLICATION_JSON); supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML); supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED); supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM); supportedMediaTypes.add(MediaType.APPLICATION_PDF); supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML); supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML); supportedMediaTypes.add(MediaType.APPLICATION_XML); supportedMediaTypes.add(MediaType.IMAGE_GIF); supportedMediaTypes.add(MediaType.IMAGE_JPEG); supportedMediaTypes.add(MediaType.IMAGE_PNG); supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM); supportedMediaTypes.add(MediaType.TEXT_HTML); supportedMediaTypes.add(MediaType.TEXT_MARKDOWN); supportedMediaTypes.add(MediaType.TEXT_PLAIN); supportedMediaTypes.add(MediaType.TEXT_XML); fastConverter.setSupportedMediaTypes(supportedMediaTypes); //创建配置类 FastJsonConfig fastJsonConfig = new FastJsonConfig(); //修改配置返回内容的过滤 //WriteNullListAsEmpty :List字段如果为null,输出为[],而非null //WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null //DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环) //WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null //WriteMapNullValue:是否输出值为null的字段,默认为false fastJsonConfig.setSerializerFeatures( SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue ); fastConverter.setFastJsonConfig(fastJsonConfig); return fastConverter; }}

实际调用链:
1.通过Feign调用接口
2.默认进入
org.springframework.http.converter.AbstractHttpMessageConverter 的 writeInternal 方法
3.FastJson实现该方法,进行数据转换处理
com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter 中的 write 方法
验证结束

https://blog.csdn.net/lppl010_/article/details/94215233

 

相关文章