Spring Boot 4 新特性:Jackson ObjectMapper 异常处理的简化
1. 引言
在 Spring Boot 应用开发中,Jackson 的 ObjectMapper 是我们处理 JSON 序列化与反序列化的核心工具。
传统上,使用其 readValue() 和 writeValueAsString() 方法时,必须使用 try-catch 块来处理 JsonProcessingException 异常(检查型异常)。随着 Spring Boot 4 的发布,这一繁琐的异常处理机制是否得到了简化?本文将通过实际项目验证这一问题。
2. 核心结论
经过在 Spring Boot 4.0.0 项目中的实际验证,ObjectMapper 的 readValue() 和 writeValueAsString() 方法确实不再需要 try-catch 块。这一改进显著简化了代码结构,提升了开发体验。

3. 原理分析
Spring Boot 4.x 将其默认的 JSON 处理库从 Jackson 2.x 升级到了 Jackson 3.x,方法抛出的异常类型从 JsonProcessingException(检查型异常)变为 JacksonException(运行时异常),不再要求调用方法时必须使用 try-catch 包围来强制捕获异常。
4. 环境与项目搭建
4.1. 项目基本信息
| 项目信息项 | 具体内容 |
|---|---|
| 项目名称 | hello-springboot4-jackson |
| SpringBoot 版本 | 4.0.0 |
| Jackson 版本 | 3.0.2 |
| Java 版本 | 21.0.1 |
| 构建工具 | Maven |
4.2. 项目初始化
4.2.1. Spring Initializr
通过 Spring Initializr 创建项目,确保依赖中包含 Web 模块,则自动包含 Jackson 依赖。

4.2.2. POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.0</version>
<relativePath/>
</parent>
<groupId>com.example.hello</groupId>
<artifactId>hello-springboot4-jackson</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hello-springboot4-jackson</name>
<description>SpringBoot4 的 jackson 测试项目</description>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.2.3. application.yaml
spring:
application:
name: hello-springboot4-jackson
4.2.4. Jackson 依赖

5. 验证过程
5.1. 数据模型准备
创建一个简单的用户值对象:
package com.example.hello.springboot4.jackson.web.vo;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class User {
private Long id;
private String username;
private String mobilePhone;
private LocalDateTime createTime;
}
5.2. 测试方法准备
package com.example.hello.springboot4.jackson.web.controller;
import com.example.hello.springboot4.jackson.web.vo.User;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tools.jackson.databind.ObjectMapper;
import java.time.LocalDateTime;
@Slf4j
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final ObjectMapper objectMapper;
@GetMapping("/test-json-string-to-object")
public User testJsonStringToObject() {
String userJson = """ { "id": 1, "mobilePhone": "18612345678", "username": "zhangsan", "createTime": "2025-12-16T23:14:58.0222814" } """;
// 注意:没有 try-catch 块!
User user = objectMapper.readValue(userJson, User.class);
log.info("用户对象:{}", user);
return user;
}
@GetMapping("/test-object-to-json-string")
public String testObjectToJsonString() {
User user = new User();
user.setId(2L);
user.setUsername("李四");
user.setMobilePhone();
user.setCreateTime(LocalDateTime.now());
objectMapper.writeValueAsString(user);
log.info(, userJsonString);
userJsonString;
}
}
5.3. readValue() 方法测试
5.3.1. 测试代码
@GetMapping("/test-json-string-to-object")
public User testJsonStringToObject() {
String userJson = """ { "id": 1, "mobilePhone": "18612345678", "username": "zhangsan", "createTime": "2025-12-16T23:14:58.0222814" } """;
// 注意:没有 try-catch 块!
User user = objectMapper.readValue(userJson, User.class);
log.info("用户对象:{}", user);
return user;
}
5.3.2. 测试结果
日志输出:
2025-12-17T23:01:53.681+08:00 INFO 14072 --- [hello-springboot4-jackson][io-8080-exec-10] c.e.h.s.j.web.controller.UserController : 用户对象:User(id=1, username=zhangsan, mobilePhone=18612345678, createTime=2025-12-16T23:14:58.022281400)
响应:
{"createTime":"2025-12-16T23:14:58.0222814","id":1,"mobilePhone":"18612345678","username":"zhangsan"}

5.4. writeValueAsString() 方法测试
5.4.1. 测试代码
@GetMapping("/test-object-to-json-string")
public String testObjectToJsonString() {
User user = new User();
user.setId(2L);
user.setUsername("李四");
user.setMobilePhone("15012345678");
user.setCreateTime(LocalDateTime.now());
// 注意:没有 try-catch 块!
String userJsonString = objectMapper.writeValueAsString(user);
log.info("用户 JSON 字符串:{}", userJsonString);
return userJsonString;
}
5.4.2. 测试结果
响应内容是合法的 JSON 字符串:

{"createTime":"2025-12-17T23:07:26.1884855","id":2,"mobilePhone":"15012345678","username":"李四"}
响应:
{"createTime":"2025-12-17T23:07:26.1884855","id":2,"mobilePhone":"15012345678","username":"李四"}

日志输出:
2025-12-17T23:07:26.189+08:00 INFO 14072 --- [hello-springboot4-jackson][nio-8080-exec-2] c.e.h.s.j.web.controller.UserController : 用户 JSON 字符串:{"createTime":"2025-12-17T23:07:26.1884855","id":2,"mobilePhone":"15012345678","username":"李四"}
6. 总结
Spring Boot 4 简化 ObjectMapper 的异常处理,减少了样板代码,使代码更加简洁优雅。对于正在使用或计划升级到 Spring Boot 4 的开发者来说,这是一个值得欢迎的变化。
在实际项目中,我们可以放心地移除那些繁琐的 try-catch 块,让代码更加专注于核心业务逻辑的实现。同时,建议在项目升级过程中,全面测试相关的 JSON 处理逻辑,确保平滑过渡。


