springboot自定义消息转换器HttpMessageConverter
SpringMVC中有两个注解可以进行http响应报文(response)和请求报文(requst),分别为@ResponseBody和@RequestBody。然而,大家遇到过这种情况吗?返回前端一个实体类,但只用其中几个属性,其他一大堆属性全部为null。
这个时候就需要消息转换器啦!
一般springboot会有默认的消息管理器,StringHttpMessageConverter(字符串转换器),FastJsonHttpMessageConverter ,MappingJackson2HttpMessageConverter等等。
今天我要说的是如何自定义消息管理器-FastJsonHttpMessageConverter
1.引用fastjson依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
2. 创建配置文件JsonHttpMessageConfiguration.java
/**
* json序列化配置类
*/
@Configuration
public class JsonHttpMessageConfiguration{
/**
* 配置全局序列化的时候为null的属性也序列化
*/
@Bean
@ConditionalOnMissingBean(FastJsonHttpMessageConverter.class)
public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
//1.需要定义一个convert转换消息的对象
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//2.添加fastJson的配置信息;
FastJsonConfig config = new FastJsonConfig();
//添加配置-config.setSerializerFeatures() 方法中可以添加多个配置(以,分开)
config.setSerializerFeatures(SerializerFeature.WriteMapNullValue,SerializerFeature.DisableCircularReferenceDetect);
//3.在convert中添加配置信息.
// 配置全局支持的媒体类型
converter.setSupportedMediaTypes(getSupportedMediaTypes());
converter.setFastJsonConfig(config);
return converter;
}
/**
* 配置全局支持的媒体类型
*/
private List<MediaType> getSupportedMediaTypes() {
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
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);
return supportedMediaTypes;
}
}
以上就配置成功啦!
以下列举SerializerFeature配置的属性解释
属性名称 | 解释 |
---|---|
QuoteFieldNames | 输出key时是否使用双引号,默认为true |
UseSingleQuotes | 使用单引号而不是双引号,默认为false |
WriteMapNullValue | 是否输出值为null的字段,默认为false应用场景:前端必须需要所有字段 |
UseISO8601DateFormat | Date使用ISO8601格式输出,默认为false |
WriteNullListAsEmpty | List字段如果为null,输出为[],而不是null |
WriteNullStringAsEmpty | 字符类型字段如果为null,输出为"",而不是null |
WriteNullNumberAsZero | 数值字段如果为null,输出为0,而非null |
WriteNullBooleanAsFalse | Boolean字段如果为null,输出为false,而非null |
SkipTransientField | 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true |
SortField | 按字段名称排序后输出。默认为false |