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. Apex 小知识:SOQL 在循环中的应用

    两种在循环中引用 SOQL 的方法 第一种方法: List<Account> accounts = [SELECT Id FROM Account WHERE NumberOfEmploy ...

  2. 三层交换机RIP动态路由实验

    一.   实验目的 1.  掌握三层交换机之间通过RIP协议实现网段互通的配置方法. 2.  理解动态实现方式与静态方式的不同 二.   应用环境 当两台三层交换机级联时,为了保证每台交换机上所连接的 ...

  3. Linux性能优化实战学习笔记:第三十五讲

    一.上节回顾 前面内容,我们学习了 Linux 网络的基础原理以及性能观测方法.简单回顾一下,Linux网络基于 TCP/IP 模型,构建了其网络协议栈,把繁杂的网络功能划分为应用层.传输层.网络层. ...

  4. 【领会要领】web前端-轻量级框架应用(jQuery基础)

    作者 | Jeskson 来源 | 达达前端小酒馆 jquery的安装和语法,jquery的多种选择器,dom操作和jquery事件. jQuery框架,简介,优势,安装,语法,jQuery选择器,i ...

  5. [LeetCode] 367. Valid Perfect Square 检验完全平方数

    Given a positive integer num, write a function which returns True if num is a perfect square else Fa ...

  6. 一、WebAPI自定义过滤器的使用

    一.WebAPI自定义过滤器的使用 1.注册过滤器 using System.Web.Http; using KYINT.WebAPIService.Handler; namespace KYINT. ...

  7. JAVA主动抛异常的几种方式及捕捉结果输出对比

    测试代码: /** * 测试异常抛出及捕捉 */ @Test public void test() { try { this.testA(); } catch (Exception ex) { Sys ...

  8. 面试官:”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“

    通常在初始化 HashMap 时,初始容量都是根据业务来的,而不会是一个固定值,为此我们需要有一个特殊处理的方式,就是将预期的初始容量,再除以 HashMap 的装载因子,默认时就是除以 0.75. ...

  9. 通过欧拉计划学习Rust编程(第22~25题)

    最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...

  10. sync 异步编程

    using System; using System.Net; using System.Threading; using System.Threading.Tasks; namespace Cons ...