本文記錄將Spring Boot 默認的Jackson框架轉換爲Fastjson的實現方式及注意事項
使用場景
在用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 方法
- 參考資料