Spring Boot整合fastjson

2023-11-18

SpringBoot在构建RESTful风格的web服务时,默认使用的是Jackson作为JSON解析器,个人使用比较习惯的 json 框架是 fastjson,所以 spring boot 默认的 json 使用起来就很陌生了,所以很自然我就 想我能不能使用 fastjson 进行 json 解析呢?

引入依赖

注意,1.2.61以下有严重高危漏洞,1.2.61修复,必须升级到1.2.61,目前最新版本为1.2.62

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>

Springboot1.x版本

第一种方法:通过extends WebMvcConfigurerAdapter并重写configureMessageConverters方法来实现。


 
import java.util.List;
 
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
@MapperScan("com.example.demo.mapper")
@SpringBootApplication(scanBasePackages= {"com.example.demo.controller","com.example.demo.service"})
public class HelloSpringBootApplication extends WebMvcConfigurerAdapter{
 
 
 
 @Override
 public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  
  //创建FastJson的消息转换器
  FastJsonHttpMessageConverter convert = new FastJsonHttpMessageConverter();
  //创建FastJson的配置对象
  FastJsonConfig config = new FastJsonConfig();
  //对Json数据进行格式化
  config.setSerializerFeatures(SerializerFeature.PrettyFormat);
  convert.setFastJsonConfig(config);
  converters.add(convert);
 }
 
 
 
 public static void main(String[] args) {
  
  SpringApplication.run(HelloSpringBootApplication.class, args);
 }
 
}

第二种方法:在项目启动类中@Bean

package com.example.demo;
 
import java.util.List;
 
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
@MapperScan("com.example.demo.mapper")
@SpringBootApplication(scanBasePackages= {"com.example.demo.controller","com.example.demo.service"})
public class HelloSpringBootApplication
{
 
 
 
 
 @Bean
 public HttpMessageConverters fastJsonMessageConverter() {
  
    //创建FastJson的消息转换器
    FastJsonHttpMessageConverter convert = new FastJsonHttpMessageConverter();
    //创建FastJson的配置对象
    FastJsonConfig config = new FastJsonConfig();
    //对Json数据进行格式化
    config.setSerializerFeatures(SerializerFeature.PrettyFormat);
    convert.setFastJsonConfig(config);
    HttpMessageConverter<?> con =convert;
    return new HttpMessageConverters(con);
 }
 
 public static void main(String[] args) {
  
  SpringApplication.run(HelloSpringBootApplication.class, args);
 }
 
}

Springboot2.0版本

package com.example.fast;

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;

@Configuration
public class JsonConfig implements 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);
    }

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> messageConverter : converters) {
            System.out.println("=====================" + messageConverter);
        }
    }
}

测试

@RestController
public class TestController {
    @RequestMapping("/test")
    public Object test() {
        User user = new User();
        user.date = new Date();
        user.name = "王章";
        return user;
    }
}

public class User {
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    public Date date;
    public String name;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot整合fastjson 的相关文章

  • “java.io.IOException:连接超时”和“SocketTimeoutException:读取超时”之间有什么区别

    如果我设置一个套接字 SoTimeout 并从中读取 当读取时间超过超时限制时 我会收到 SocketTimeoutException 读取超时 这是我的例子中的堆栈 java net SocketTimeoutException Read
  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • 如何在 Openfire 中使用 smack

    你好 我计划开发一个可以连接到 gtalk facebook 等的聊天客户端 我决定将 smack API 与 openfire 一起使用 但我需要很少的指导来了解如何将它与 openfire 服务器一起使用 openfire 是否提供了基
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • FileNotFoundException - Struts2 文件上传

    Strange FileNotFoundException使用Struts2上传文件时 这是 JSP 的一部分
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 当 minifyEnabled 为 true 时 Android 应用程序崩溃

    我正在使用多模块应用程序 并且该应用程序崩溃时minifyEnabled true in the installed模块的build gradle 以下是从游戏控制台检索到的反混淆堆栈跟踪 FATAL EXCEPTION Controlle
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • WIN10+VS2013+CUDA10安装方法

    1 先安装VS 先安装VS 先安装VS 安装CUDA会配置VS文件 反向的话VS中找不到文件 VS安装参考 https blog csdn net m0 37477061 article details 83447773 2 安装CUDA
  • E-R模型应用示例

    E R模型应用示例 例1 1 设有某计算机系统集成制造公司需要建立一个零配件物资管理系统 该公司组装不同型号计算机所用的零配件由不同供货商供给 存放在多个仓库中 由多名仓库管理员管理 试用E R模型对该公司的零配件管理工作进行分析 根据该公
  • STM32移植lwip之官方源码解析

    本篇目标 分析stm32的ETH MAC控制器 初始化及lwip是如何与stm32底层连接的 材料准备 官方资料 包含代码和移植手册 stm32官方移植lwip资料 修改代码 包含移植后的代码 STM32官方移植lwip修改代码 修改参考
  • C++智能指针:shared_ptr用法详解

    C 智能指针 shared ptr用法详解 shared ptr是C 11里的新特性 其包装了new操作符在堆上分配的动态对象 如 shared ptr
  • MATLAB自动生成标记点

    在测试算法准确性的过程中 需要在图像上生成一些大小已知的标记点来识别 同时又需要生成的标记点位置随机 以测试算法的适用性 本人搜索自动生成标记点没有找到相关内容 因此将完成思路整理如下 随机生成点位置 MATLAB生成随机点很容易实现 使用
  • 解决django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.3 or newer is required; you have 1.0.

    最近在配置环境时遇到这样的问题 在网上查找了很多资料 比如注释base py中的代码 又或是添加如下代码 这些方法对我来说都不管用 后面又查到说可以降低django的版本 随后我重新安装了django2的版本 然后报以下错误 TypeErr
  • layui php+PHPExcel 拉取excel表格数据一键导入

    需求 大量数据需要导入数据库 直接拉取excel表格进行读取数据并存入数据库 过程中不对文件进行存储 使用上传过程中的缓存文件 前端代码 layui php
  • vs2019配置Qt5开发环境

    使用visual studi 2019配置qt5开发环境 以及创建qt项目s 一 下载安装visual Studio2019 1 进入visual studio 官网下载community 2019版本 安装器 2 下载完成后启动visua
  • Vue2里的computed的传参方法

    在使用element ui的时候 后台返回的字段需要你来判断显示什么 这时候可能就需要计算属性了 但是使用computed无法传值 可以通过computed定义的函数里面返回一个函数来接受传值 进行判断 如果直接使用computed传参是报
  • 使用nrm管理npm仓库

    引言 目前遇到了这样的问题 因为个人和公司的npm仓库环境不一样 导致使用时需要频繁的切换npm指向 所以 为了提高工作效率 就采用了nrm的方式来管理多个npm仓库 老规矩 先举一个 For example 当前有两个仓库指向 分别是 公
  • PyCharm安装教程最新版(社区版)

    1 官网下载地址 PyCharm the Python IDE for Professional Developers by JetBrains 2 安装 直接Install进行安装 最后点击finish即可 3 新建项目并测试 新建一个项
  • 线程安全分析

    1 成员变量和静态变量是否线程安全 如果它们没有被共享 则线程安全 如果它们被共享了 根据它们的状态是否能够改变 又分两种情况 如果只有读操作 则线程安全 如果有读写操作 则这段代码是临界区 需要考虑线程安全 2 局部变量是否线程安全 局部
  • 编译工具Make

    文章目录 make指令 指定目标 隐藏指令 通配符 伪目标 多目标 Makefile的命令 变量 变量的基础 赋值变量 函数调用 字符串操作函数 文件名操作函数 循环函数 条件判断函数 条件判断语句 隐式规则 隐式规则举例 隐式规则中的变量
  • Linux性能监控 -- vmstat命令

    文章目录 示例 字段说明 示例 输入vmstat命令后 第一个参数表示每1秒获取一次服务器资源 第二个参数表示总共获取10次 若第二个参数不设置 则表示持续获取服务器资源 字段说明 数据项 含义 r 表示有多少任务需要CPU执行 通常与后5
  • Button与ImageButton的点击监听事件-onClick

    Button与ImageButton自身都有一个onClick点击事件 通过自身的 setOnClickListener OnClickListener 的方法添加点击事件 所有控件都有一个OnClick事件 通过点击事件的监听可以实现点击
  • 吐血总结《Mysql从入门到入魔》,图文并茂

    文章目录 1 数据库操作 1 1显示数据库 1 2 创建数据库 1 3 使用数据库 1 4 查看当前数据库 1 5 删除数据库 2 表操作 2 1 创建表 2 2 更新表 2 2 1 添加列 2 2 2 删除列 2 3 查看表结构 2 4
  • CTF基本赛制与题型

    CTF简介 CTF的全称为Capture The Flag 即夺旗赛 CTF竞赛活动蓬勃发展 已成为了锻炼信息安全技术 展现安全能力和水平的绝佳平台 CTF号称计算机界的奥林匹克 CTF目标 CTF参赛队伍的目标为获取尽可能多的flag 参
  • 随机抽样一致性算法(RANSAC)示例及源代码

    作者 王先荣 大约在两年前翻译了 随机抽样一致性算法RANSAC 在文章的最后承诺写该算法的C 示例程序 可惜光阴似箭 转眼许久才写出来 实在抱歉 本文将使用随机抽样一致性算法来来检测直线和圆 并提供源代码下载 一 RANSAC检测流程 在
  • maven死活下载不了jar包的问题

    对应 问题6 选择适合自己的更新方式 通过排除法排除过的问题 1 idea版本问题 换了4个版本都有问题 2 电脑问题 差点重装 3 网络问题 换了手机网络一样不行 4 仓库 xml配置 或者maven插件版本的问题 试了很多版本 包括id
  • Spring Boot整合fastjson

    SpringBoot在构建RESTful风格的web服务时 默认使用的是Jackson作为JSON解析器 个人使用比较习惯的 json 框架是 fastjson 所以 spring boot 默认的 json 使用起来就很陌生了 所以很自然