Browse Source

HttpMessageConverter

王智勇 5 years ago
parent
commit
e7c0d1bfeb
1 changed files with 116 additions and 0 deletions
  1. 116 0
      source/_posts/HttpMessageConverter.md

+ 116 - 0
source/_posts/HttpMessageConverter.md

@@ -0,0 +1,116 @@
+---
+title: HttpMessageConverter
+date: 2018-10-09 18:33:35
+tags:Spring Boot HttpMessageConverter
+categories:Java Spring 
+---
+#### Spring Boot 设置消息类型转换
+1. 通过实现 WebMvcConfigurer 接口 并重写 configureMessageConverters 方法
+```java
+@Override
+public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+     //创建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();
+     //设置默认时间转换格式
+     JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+     //修改配置返回内容的过滤
+     //WriteNullListAsEmpty  :List字段如果为null,输出为[],而非null
+     //WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null
+     //DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
+     //WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
+     //WriteMapNullValue:是否输出值为null的字段,默认为false
+     //WriteDateUseDateFormat 使用自定义时间格式
+     fastJsonConfig.setSerializerFeatures(
+     SerializerFeature.DisableCircularReferenceDetect,
+     SerializerFeature.WriteMapNullValue,
+     SerializerFeature.WriteDateUseDateFormat
+     );
+     fastConverter.setFastJsonConfig(fastJsonConfig);
+     //将fastjson添加到视图消息转换器列表内
+     converters.add(fastConverter);
+ }
+```
+
+2. 在 @Configuration 类中手动添加 Bean
+
+```java
+@Bean
+public HttpMessageConverters fastJsonHttpMessageConverters() {
+    //创建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();
+    //设置默认时间转换格式
+    JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    //修改配置返回内容的过滤
+    //WriteNullListAsEmpty  :List字段如果为null,输出为[],而非null
+    //WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null
+    //DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
+    //WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
+    //WriteMapNullValue:是否输出值为null的字段,默认为false
+    //WriteDateUseDateFormat 使用自定义时间格式
+    fastJsonConfig.setSerializerFeatures(
+            SerializerFeature.DisableCircularReferenceDetect,
+            SerializerFeature.WriteMapNullValue,
+            SerializerFeature.WriteDateUseDateFormat
+    );
+    fastConverter.setFastJsonConfig(fastJsonConfig);
+    return new HttpMessageConverters(fastConverter);
+}
+```
+
+##### 问题小记
+
+- jackson-dataformat-xml 依赖会影响解析器的加载,应设置默认加载类型或调整顺序
+- converters 解析有顺。如果使用第一种方法,可能使用默认使用 MappingJackson2HttpMessageConverter 导致新添加的解析器不生效,即使用第二种方法
+- 若出现返回的json数据中包含/ 转移 等字符,可在当前加载器前添加 StringHttpMessageConverter 解析器
+```java
+@Bean
+public HttpMessageConverters stringHttpMessageConverter() {
+    StringHttpMessageConverter converter = new StringHttpMessageConverter(
+            Charset.forName("UTF-8"));
+    return new HttpMessageConverters(converter);
+}
+```