Spring Boot DTO 中的 Boolean 字段变为 null?原因及解决方法

发布: (2026年1月3日 GMT+8 03:57)
5 min read
原文: Dev.to

Source: Dev.to

Spring Boot DTO 中布尔字段变为 null 的封面图(这里是原因以及如何修复)

如果你在使用 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

booleanBoolean 在 Spring Boot DTO 中的区别

类型默认值可为空
booleanfalse
Booleannull

何时使用

  • 当字段是必填时使用 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 应用中为你节省数小时的调试时间。

Back to Blog

相关文章

阅读更多 »

让我们分离分离

简介 在2025年最后几天,我们的团队负责人额外请了一天假,错过了一个重要会议。最近的重组后,一位同事离职……