应统一使用包装类(如Integer)接收前端参数,因基本类型(如int)不能为null,JSON反序列化时遇null或缺失字段会抛NullPointerException或NumberFormatException,而包装类可安全承载null值并配合显式空校验保障空值安全。

Java 基本类型(如 int、boolean、double)和对应的包装类(如 Integer、Boolean、Double)在对接前端数据时,核心在于「反序列化」和「空值安全」——前端传来的 JSON 数据里,数字可能为 null 或缺失字段,而基本类型不能为 null,强行赋值会抛出 NullPointerException 或 NumberFormatException。
用包装类接收前端参数,避免空值崩溃
Spring Boot 中,Controller 方法参数或 DTO 字段应统一使用包装类(如 Integer),而非基本类型(如
int</code):</p>
<ul>
<li>前端发送 <code>{"age": null} 或不传 age 字段时,Integer age 会被设为 null,安全;而 int age 会触发类型转换异常或默认为 0(取决于 Jackson 配置),掩盖业务语义
@Data 或手动写 getter/setter 时,保持字段类型为包装类,Jackson 默认能正确解析 null、缺失字段、合法数字字符串(如 "123")int),应在 Service 层做显式判空转换,不要在 Controller 层强转后端返回给前端时,基本类型可自动装箱,但需注意默认值陷阱
JSON 序列化(如用 Jackson)时,基本类型字段会自动转成对应数值,包装类的 null 则序列化为 JSON 的 null:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 推荐在响应 DTO 中继续使用包装类(如
Integer code),便于区分“未设置”和“值为 0” - 如果用基本类型(如
int code = 0),前端收到永远是0,无法判断是服务端主动设为 0,还是字段未初始化导致的默认值 - 可通过
@JsonInclude(JsonInclude.Include.NON_NULL)注解让包装类null字段不输出,减少冗余
手动转换要加空值和范围校验,别依赖自动拆箱
当需要把包装类转为基本类型参与计算(如数据库插入、数学运算),必须显式判空并设定默认逻辑:
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误写法:
int value = integerObj.intValue();——integerObj == null时直接 NPE - ✅ 推荐写法:
int value = Optional.ofNullable(integerObj).orElse(0);或int value = integerObj != null ? integerObj : 0; - 对布尔类型尤其敏感:前端传
{"active": null},Boolean active是null,但active.booleanValue()会 NPE;建议用Objects.equals(active, Boolean.TRUE)判断是否为真
统一配置 Jackson,减少隐式行为
在 application.yml 中调整 Jackson 行为,让空值处理更可控:
-
spring.jackson.deserialization.fail-on-null-for-primitives=false(默认 true):允许基本类型字段接收 null 并设为默认值(不推荐,掩盖问题) -
spring.jackson.deserialization.read-null-as-missing=true:把 null 当作字段缺失,配合@JsonProperty(required = false)更清晰 - 自定义
Module添加NullAwareIntegerDeserializer等,实现“null → 默认值”逻辑,但仅限全局一致策略场景

















