Spring Boot DTO 中的 Boolean 字段变为 null?原因及解决方法
Source: Dev.to

如果你在使用 Spring Boot 构建 REST API,可能会遇到一个奇怪且令人沮丧的问题:
请求的 JSON 明明发送了布尔值(
true/false),但在 DTO 中该值却变成了 null。
没有异常,没有警告,也没有堆栈跟踪。
这并不是 Spring Boot 的 bug —— 而是 Jackson + Java Bean 命名陷阱,在实际项目中经常出现。
在本文中,您将学习
- 为什么布尔值在 Spring Boot DTO 中会变为
null - Jackson 如何将 JSON 属性映射到 Java 字段
- 为什么
@JsonProperty能解决此问题 - 推荐的最佳实践,以永远避免此问题
问题:DTO 中的布尔值为 null
请求负载
{
"isActive": true
}
DTO
public class UserRequest {
private Boolean isActive;
public Boolean getIsActive() {
return isActive;
}
public void setIsActive(Boolean isActive) {
this.isActive = isActive;
}
}
控制器
@PostMapping("/user")
public void createUser(@RequestBody UserRequest request) {
System.out.println(request.getIsActive());
}
实际输出
null
为什么会出现这种情况(Jackson + Java Bean 规则)
Spring Boot 使用 Jackson 将 JSON 转换为 Java 对象。Jackson 遵循 Java Bean 命名约定,这在很大程度上取决于 getter 和 setter 的名称。
Jackson 如何解释布尔字段
对于声明为:
private Boolean isActive;
Jackson 期望以下方法模式之一:
public Boolean isActive() // 对于基本类型 boolean
// or
public Boolean getActive()
但 DTO 定义了:
public Boolean getIsActive()
不匹配
- JSON 属性:
isActive - Jackson 推断的 Java 属性:
active
由于这种不匹配,Jackson 无法绑定该值,导致 null。
解决方案 1:使用 @JsonProperty(快速修复)
显式告诉 Jackson 如何映射 JSON 属性。
import com.fasterxml.jackson.annotation.JsonProperty;
public class UserRequest {
@JsonProperty("isActive")
private Boolean isActive;
public Boolean getIsActive() {
return isActive;
}
public void setIsActive(Boolean isActive) {
this.isActive = isActive;
}
}
结果: JSON 正确映射,DTO 接收到 true / false,不再出现 null。
方案 2:最佳实践(强烈推荐)
与其修复映射,不如修正设计。避免使用 is 开头的布尔字段名。
首选 DTO 设计
public class UserRequest {
private Boolean active;
public Boolean getActive() {
return active;
}
public void setActive(Boolean active) {
this.active = active;
}
}
为什么这样更好
- 完全符合 Java Bean 规范
- 不需要 Jackson 注解
- DTO 更简洁、可读性更高
- 在大型代码库中更少出现 bug
boolean 与 Boolean 在 Spring Boot DTO 中的区别
| 类型 | 默认值 | 可为空 |
|---|---|---|
boolean | false | 否 |
Boolean | null | 是 |
何时使用
- 当字段是必填时使用
boolean。 - 当字段是可选或三态时使用
Boolean。
常见面试问题
Q: 为什么 Spring Boot 将布尔 JSON 值映射为 null?
A: 因为 Jackson 遵循 Java Bean 命名约定。以 is 为前缀的布尔字段如果没有正确定义 getter、setter 或 @JsonProperty,会导致属性名称不匹配。
Key Takeaways
- 以
is开头的布尔字段可能会悄无声息地破坏 Jackson 的映射。 - Jackson 依赖 getter/setter 的命名,而不是字段名。
- 使用
@JsonProperty可以显式修复此问题。 - 最佳实践:在 DTO 字段中避免使用
is前缀。 - 在调试控制器之前,务必检查 DTO 设计。
最终建议
如果你的 JSON 看起来正确,但 DTO 的值为 null:
首先检查 getter 和 setter 的命名。
这一个小细节可以在 Spring Boot 应用中为你节省数小时的调试时间。