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