https://my.oschina.net/u/3419586/blog/2964047
背景:
在用Feign Client 接口調用,由於jackson對null等特殊值處理存在異常,故改用fastjson解析數據
操作步驟:
1.增加文件FeignConfig,注入Bean,修改默認Feign默認的解析方式
2.由於fastjson1.2.28后,增加了對Content-type驗證,故添加多種MediaType
@Configuration public 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
