|
@@ -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);
|
|
|
+}
|
|
|
+```
|