SpringBoot2.0如何集成fastjson?在网上查了一堆资料,但是各文章的说法不一,有些还是错的,可能只是简单测试一下就认为ok了,最后有没生效都不知道。恰逢公司项目需要将JackSon换成fastjson,因此自己来实践一下SpringBoot2.0和fastjson的整合,同时记录下来方便自己后续查阅。

一、Maven依赖说明

    SpringBoot的版本为: <version>2.1.4.RELEASE</version>
    在pom文件中添加fastjson的依赖:
        <!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
6
 
1
        <!-- fastjson -->
2
        <dependency>
3
            <groupId>com.alibaba</groupId>
4
            <artifactId>fastjson</artifactId>
5
            <version>1.2.56</version>
6
        </dependency>


二、整合

        我们写一个配置类WebConfig实现WebMvcConfigurer接口,然后重写configureMessageConverters方法。具体的代码如下:
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(); //自定义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);
}
}
65
 
1
package com.psx.gqxy.config;
2

3
import com.alibaba.fastjson.serializer.SerializerFeature;
4
import com.alibaba.fastjson.support.config.FastJsonConfig;
5
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
6
import org.springframework.context.annotation.Configuration;
7
import org.springframework.http.MediaType;
8
import org.springframework.http.converter.HttpMessageConverter;
9
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
10
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
11
import java.util.ArrayList;
12
import java.util.List;
13

14
/**
15
 * web相关的定制化配置
16
 * @author ZENG.XIAO.YAN
17
 * @version 1.0
18
 * @Date 9012-88-88
19
 */
20
@Configuration
21
public class WebConfig implements WebMvcConfigurer {
22
    // WebMvcConfigurerAdapter 这个类在SpringBoot2.0已过时,官方推荐直接实现WebMvcConfigurer 这个接口
23

24
    /**
25
     * 使用fastjson代替jackson
26
     * @param converters
27
     */
28
    @Override
29
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
30
        /*
31
         先把JackSon的消息转换器删除.
32
         备注: (1)源码分析可知,返回json的过程为:
33
                    Controller调用结束后返回一个数据对象,for循环遍历conventers,找到支持application/json的HttpMessageConverter,然后将返回的数据序列化成json。
34
                    具体参考org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor的writeWithMessageConverters方法
35
               (2)由于是list结构,我们添加的fastjson在最后。因此必须要将jackson的转换器删除,不然会先匹配上jackson,导致没使用fastjson
36
        */
37
        for (int i = converters.size() - 1; i >= 0; i--) {
38
            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
39
                converters.remove(i);
40
            }
41
        }
42
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
43

44
        //自定义fastjson配置
45
        FastJsonConfig config = new FastJsonConfig();
46
        config.setSerializerFeatures(
47
                SerializerFeature.WriteMapNullValue,        // 是否输出值为null的字段,默认为false,我们将它打开
48
                SerializerFeature.WriteNullListAsEmpty,     // 将Collection类型字段的字段空值输出为[]
49
                SerializerFeature.WriteNullStringAsEmpty,   // 将字符串类型字段的空值输出为空字符串
50
                SerializerFeature.WriteNullNumberAsZero,    // 将数值类型字段的空值输出为0
51
                SerializerFeature.WriteDateUseDateFormat,
52
                SerializerFeature.DisableCircularReferenceDetect    // 禁用循环引用
53
        );
54
        fastJsonHttpMessageConverter.setFastJsonConfig(config);
55

56
        // 添加支持的MediaTypes;不添加时默认为*/*,也就是默认支持全部
57
        // 但是MappingJackson2HttpMessageConverter里面支持的MediaTypes为application/json
58
        // 参考它的做法, fastjson也只添加application/json的MediaType
59
        List<MediaType> fastMediaTypes = new ArrayList<>();
60
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
61
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
62
        converters.add(fastJsonHttpMessageConverter);
63
    }
64
}
65



三、测试

        (1)代码
        要测试fastjson是否整合成功的话,我们只需要在实体类中使用一下fastjson的注解就ok。如果注解生效了,说明fastjson整合成功了。直接看代码
package com.psx.gqxy.web.controller;

import com.alibaba.fastjson.annotation.JSONField;
import com.psx.gqxy.common.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;
@JSONField(format = "yyyy年MM月dd日")
private Date birthDay;
private List<String> qqList;
}
}
49
 
1
package com.psx.gqxy.web.controller;
2

3
import com.alibaba.fastjson.annotation.JSONField;
4
import com.psx.gqxy.common.base.ModelResult;
5
import lombok.Data;
6
import org.springframework.web.bind.annotation.GetMapping;
7
import org.springframework.web.bind.annotation.RestController;
8
import java.util.Date;
9
import java.util.List;
10

11
/**
12
 * TestController
13
 * @author ZENG.XIAO.YAN
14
 * @version 1.0
15
 * @Date 9012-88-88
16
 */
17
@RestController
18
public class TestController {
19

20
    @GetMapping("/json")
21
    public ModelResult<JsonBean> testJson() {
22
        ModelResult<JsonBean> result = new ModelResult<>();
23
        JsonBean jsonBean = new JsonBean();
24
        jsonBean.setBirthDay(new Date());
25
        jsonBean.setName("测试");
26
        result.setData(jsonBean);
27
        // 效果
28
        /*{
29
            "code": "200",
30
                "data": {
31
            "birthDay": "2019年05月12日",
32
                    "name": "测试",
33
                    "qqList": []
34
        },
35
            "msg": ""
36
        }*/
37
        return result;
38
    }
39

40

41
    @Data
42
    class JsonBean {
43
        private String name;
44
        @JSONField(format = "yyyy年MM月dd日")
45
        private Date birthDay;
46
        private List<String> qqList;
47
    }
48
}
49

        (2)效果
                


        通过这个2步的测试,发现fastjson的注解生效了,也就说明整合成功了

四、杂谈

    SpringBoot2.0后,有些东西改变了。在SpringBoot 1.X时代,整合fastjson是可以不排除JackSon消息转换器的。但在SpringBoot2.X时代,必须要排除JackSon消息转换器。

            
 
 

SpringBoot2.0整合fastjson的正确姿势的更多相关文章

  1. 第二篇:SpringBoot2.0整合ActiveMQ

    本篇开始将具体介绍SpringBoot如何整合其它项目. 如何创建SpringBoot项目 访问https://start.spring.io/. 依次选择构建工具Maven Project.语言ja ...

  2. SpringBoot2.0 整合 QuartJob ,实现定时器实时管理

    一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...

  3. SpringBoot2.0 整合 Swagger2 ,构建接口管理界面

    一.Swagger2简介 1.Swagger2优点 整合到Spring Boot中,构建强大RESTful API文档.省去接口文档管理工作,修改代码,自动更新,Swagger2也提供了强大的页面测试 ...

  4. SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用

    一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层 ...

  5. SpringBoot2.0 整合 Redis集群 ,实现消息队列场景

    本文源码:GitHub·点这里 || GitEE·点这里 一.Redis集群简介 1.RedisCluster概念 Redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的 ...

  6. springboot2.0整合logback日志(详细)

    <div class="post"> <h1 class="postTitle"> springboot2.0整合logback日志(详 ...

  7. Springboot2.0整合Redis(注解开发)

    一. pom.xm文件引入对应jar包 <dependency> <groupId>org.springframework.boot</groupId> <a ...

  8. springBoot2.0+redis+fastJson+自定义注解实现方法上添加过期时间

    springBoot2.0集成redis实例 一.首先引入项目依赖的maven jar包,主要包括 spring-boot-starter-data-redis包,这个再springBoot2.0之前 ...

  9. SpringBoot2.0应用(三):SpringBoot2.0整合RabbitMQ

    如何整合RabbitMQ 1.添加spring-boot-starter-amqp <dependency> <groupId>org.springframework.boot ...

随机推荐

  1. @ConfigurationProperties 注解使用

    @ConfigurationProperties 注解使用 依赖和文件 <dependency> <groupId>org.springframework.boot</g ...

  2. OpenVINO 目标检测底层C++代码改写实现(待优化)

    System: Centos7.4 I:OpenVINO 的安装 refer:https://docs.openvinotoolkit.org/latest/_docs_install_guides_ ...

  3. control+shift + o热键冲突?????

    不知道有没有宝贝跟我遇到一样的问题 就是    control +shift+o    热键冲突了 进过我的严密调查. 这是因为你用的是A卡. 只要你把A卡换成N卡就可以了, 但是因为我太贫穷了,只能 ...

  4. [LeetCode] 883. Projection Area of 3D Shapes 三维物体的投影面积

    On a N * N grid, we place some 1 * 1 * 1 cubes that are axis-aligned with the x, y, and z axes. Each ...

  5. [LeetCode] 670. Maximum Swap 最大置换

    Given a non-negative integer, you could swap two digits at most once to get the maximum valued numbe ...

  6. [LeetCode] 230. Kth Smallest Element in a BST 二叉搜索树中的第K小的元素

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  7. 【贪心】umi的函数

    原题传送门 思路 这道题乍一看很难,然而实际在草纸上一模拟,结果就出来了. 分析:这道题实际上要么无解,要么有无数个解,因而题目只要求输出了一个解(明白这点题目就做出来一半了). 题中,规定所求z满足 ...

  8. oracle--10安装问题

    01,ins_ctx.mk INFO: make: *** [ctxhx] Error INFO: End output from spawned process. INFO: ----------- ...

  9. 【07月16日】A股滚动市净率PB历史新低排名

    2010年01月01日 到 2019年07月16日 之间,滚动市净率历史新低排名. 上市三年以上的公司,2019年07月16日市净率在30以下的公司. 来源:A股滚动市净率(PB)历史新低排名. 1 ...

  10. Unity Shader 屏幕后效果——Bloom外发光

    Bloom的原理很简单,主要是提取渲染图像中的亮部区域,并对亮部区域进行模糊处理,再与原始图像混合而成. 一般对亮部进行模糊处理的部分采用高斯模糊,关于高斯模糊,详见之前的另一篇博客: https:/ ...