SpringBoot2.0整合fastjson的正确姿势

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SpringBoot2.0整合fastjson 的正确姿势
SpringBoot2.0如何集成fastjson ?在⽹上查了⼀堆资料,但是各⽂章的说法不⼀,有些还是错的,可能只是简单测试⼀下就认为ok 了,最后有没⽣效都不知道。

恰逢公司项⽬需要将JackSon 换成fastjson ,因此⾃⼰来实践⼀下SpringBoot2.0和fastjson 的整合,同时记录下来⽅便⾃⼰后续查阅。

⼀、Maven 依赖说明
SpringBoot 的版本为: <version>2.1.4.RELEASE </version>
在pom ⽂件中添加fastjson 的依赖:
⼆、整合
我们写⼀个配置类WebConfig 实现WebMvcConfigurer 接⼝,然后重写configureMessageConverters ⽅法。

具体的代码如下: <!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
package com .psx.gqxy.config;import com.alibaba.fastjson.serializer.SerializerFeature;import com.alibaba.fastjson.support.config.FastJsonConfig;import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;import org.springframework.context.annotation.Configuration;import org.springframework.http.MediaType;import org.springframework.http.converter.HttpMessageConverter;import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.ArrayList;import java.util.List;/** * web 相关的定制化配置 * @author ZENG.XIAO.YAN * @version 1.0 * @Date 9012-88-88 */@Configuration public class WebConfig implements WebMvcConfigurer { // WebMvcConfigurerAdapter 这个类在SpringBoot2.0已过时,官⽅推荐直接实现WebMvcConfigurer 这个接⼝ /** * 使⽤fastjson 代替jackson * @param converters */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { /* 先把JackSon 的消息转换器删除. 备注: (1)源码分析可知,返回json 的过程为: Controller 调⽤结束后返回⼀个数据对象,for 循环遍历conventers ,找到⽀持application/json 的HttpMessageConverter ,然后将返回的数据序列化成json 。

具体参考org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor 的writeWithMessageConverters ⽅法 (2)由于是list 结构,我们添加的fastjson 在最后。

因此必须要将jackson 的转换器删除,不然会先匹配上jackson ,导致没使⽤fastjson */ for (int i = converters.size() - 1; i >= 0; i--) { if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) { converters.remove(i); } } FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
1234561
2
34
5
6
7
8
9
10
11
12
13
1415
16
17
18
19
20
21
22
23
2425
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
三、测试
(1)代码
要测试fastjson 是否整合成功的话,我们只需要在实体类中使⽤⼀下fastjson 的注解就ok 。

如果注解⽣效了,说明fastjson 整合成功了。

直接看代码 //⾃定义fastjson 配置 FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(
SerializerFeature.WriteMapNullValue, // 是否输出值为null 的字段,默认为false,我们将它打开
SerializerFeature.WriteNullListAsEmpty, // 将Collection 类型字段的字段空值输出为[]
SerializerFeature.WriteNullStringAsEmpty, // 将字符串类型字段的空值输出为空字符串
SerializerFeature.WriteNullNumberAsZero, // 将数值类型字段的空值输出为0
SerializerFeature.WriteDateUseDateFormat,
SerializerFeature.DisableCircularReferenceDetect // 禁⽤循环引⽤
);
fastJsonHttpMessageConverter.setFastJsonConfig(config);
// 添加⽀持的MediaTypes;不添加时默认为*/*,也就是默认⽀持全部 // 但是MappingJackson2HttpMessageConverter ⾥⾯⽀持的MediaTypes 为application/json
// 参考它的做法, fastjson 也只添加application/json 的MediaType
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
converters.add(fastJsonHttpMessageConverter);
}
}
package com .psx.gqxy.web.controller;import com.alibaba.fastjson.annotation.JSONField;import mon.base.ModelResult;import lombok.Data;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.util.Date;import java.util.List;/** * TestController * @author ZENG.XIAO.YAN * @version 1.0 * @Date 9012-88-88 */@RestController public class TestController { @GetMapping ("/json") public ModelResult<JsonBean> testJson() { ModelResult<JsonBean> result = new ModelResult<>(); JsonBean jsonBean = new JsonBean(); jsonBean.setBirthDay(new Date());
jsonBean.setName("测试");
result.setData(jsonBean);
// 效果
/*{
"code": "200",
"data": {
"birthDay": "2019年05⽉12⽇",
"name": "测试",
"qqList": []
},
"msg": ""
}*/
return result;
}
@Data class JsonBean {
private String name;
43
444546474849505152535455
56575859606162636465
1
2
34
5
6
7
8
9
10
1112
13
14
15
16
17
18
19
2021
22
23
2425262728293031323334353637383940
414243
(2)效果
通过这个2步的测试,发现fastjson 的注解⽣效了,也就说明整合成功了
四、杂谈
SpringBoot2.0后,有些东西改变了。

在SpringBoot 1.X 时代,整合fastjson 是可以不排除JackSon 消息转换器的。

但在SpringBoot2.X 时代,必须要排除JackSon 消息转换器。

@JSONField (format = "yyyy 年MM ⽉dd ⽇")
private Date birthDay;
private List<String> qqList;
}
}
444546474849。

相关文档
最新文档