一:消息转换器能干什么?
不知道大家有没有遇到过这种情况:后台接口返回一个实例,当你需要使用某个属性的值时,你还要判断一下值是否为null;接口返回一堆属性值为null的属性等
ok,消息转换器可以帮你解决这个问题
二:添加fastjson依赖
打开pom.xml,找到<dependencies></dependencies>标签,在标签中添加fastjson依赖
1
2
3
4
5
6 1<dependency>
2 <groupId>com.alibaba</groupId>
3 <artifactId>fastjson</artifactId>
4 <version>1.2.22</version>
5</dependency>
6
然后鼠标右键选择Maven→Reimport进行依赖下载
三:创建配置文件
在文件夹configurer中创建WebConfigurer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 1package com.example.demo.core.configurer;
2
3import com.alibaba.fastjson.serializer.SerializerFeature;
4import com.alibaba.fastjson.support.config.FastJsonConfig;
5import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4;
6import org.springframework.context.annotation.Configuration;
7import org.springframework.http.MediaType;
8import org.springframework.http.converter.HttpMessageConverter;
9import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
10
11import java.nio.charset.Charset;
12import java.util.ArrayList;
13import java.util.List;
14
15/**
16 * @author phubing
17 * @Description:
18 * @time 2019/4/19 10:42
19 */
20@Configuration
21public class WebConfigurer extends WebMvcConfigurationSupport {
22
23 /**
24 * 修改自定义消息转换器
25 * @param converters
26 */
27 @Override
28 public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
29 FastJsonHttpMessageConverter4 converter = new FastJsonHttpMessageConverter4();
30 converter.setSupportedMediaTypes(getSupportedMediaTypes());
31 FastJsonConfig config = new FastJsonConfig();
32 config.setSerializerFeatures(
33 // String null -> ""
34 SerializerFeature.WriteNullStringAsEmpty,
35 // Number null -> 0
36 SerializerFeature.WriteNullNumberAsZero,
37 //禁止循环引用
38 SerializerFeature.DisableCircularReferenceDetect
39 );
40 converter.setFastJsonConfig(config);
41 converter.setDefaultCharset(Charset.forName("UTF-8"));
42 converters.add(converter);
43 }
44
45 private List<MediaType> getSupportedMediaTypes() {
46 List<MediaType> supportedMediaTypes = new ArrayList<>();
47 supportedMediaTypes.add(MediaType.APPLICATION_JSON);
48 supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
49 supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
50 supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
51 supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
52 supportedMediaTypes.add(MediaType.APPLICATION_PDF);
53 supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
54 supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
55 supportedMediaTypes.add(MediaType.APPLICATION_XML);
56 supportedMediaTypes.add(MediaType.IMAGE_GIF);
57 supportedMediaTypes.add(MediaType.IMAGE_JPEG);
58 supportedMediaTypes.add(MediaType.IMAGE_PNG);
59 supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
60 supportedMediaTypes.add(MediaType.TEXT_HTML);
61 supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
62 supportedMediaTypes.add(MediaType.TEXT_PLAIN);
63 supportedMediaTypes.add(MediaType.TEXT_XML);
64 return supportedMediaTypes;
65 }
66}
67
其中
1
2 1config.setSerializerFeatures()
2
方法中可以添加多个配置,以下列举出几个常用配置,更多配置请自行百度
1
2
3
4
5
6 1WriteNullListAsEmpty :List字段如果为null,输出为[],而非null
2WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null
3DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
4WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
5WriteMapNullValue:是否输出值为null的字段,默认为false复制代码
6
四:数据库中添加测试数据
1
2
3 1INSERT INTO `user_info` VALUES ('1', '1');
2INSERT INTO `user_info` VALUES ('2', null);复制代码
3
五:测试
查询条件id为2
未配置转换器时,查询结果为
1
2
3
4
5
6
7
8
9 1{
2 "code": 200,
3 "msg": "success",
4 "data": {
5 "id": 2,
6 "userName": null
7 }
8}
9
配置转换器之后,查询结果为
1
2
3
4
5
6
7
8
9 1{
2 "code": 200,
3 "data": {
4 "id": 2,
5 "userName": "" //这里已经变为"",而不是null
6 },
7 "msg": "success"
8}
9