Spring Boot @RequestBody映射JSON时未传字段默认null的实现方法
问题说明
向Spring Boot接口foo()发起POST请求时,携带如下JSON格式请求体:
{ "a": "hallo", "b": "world", "aa": 10 }
接口定义如下:
@PostMapping("/foo") public void foo(@RequestBody MyClass myClass) { //执行相关业务逻辑 }
参数接收类定义:
class MyClass { String a; String b; String c; int aa; }
默认情况下框架可自动完成JSON到对象的字段映射,但需要实现规则:仅对JSON中实际传递的字段赋值,MyClass里未接收到传参的其余字段统一初始化为null。
实现步骤
- 第一步:将类中所有基本数据类型替换为对应包装类型
Java的基本数据类型(int/long/boolean/char等)在JVM层面不支持null值,未赋值时会自动赋予类型默认值(比如int默认0,boolean默认false),这是语言特性,任何反序列化框架都无法突破。要让未传参字段为null,必须先把基本类型替换为对应的包装类型,修改后的MyClass如下:class MyClass { String a; String b; String c; // 原int类型替换为包装类Integer,支持null赋值 Integer aa; } - 第二步:配置Jackson反序列化规则(全局生效)
Spring Boot默认使用Jackson做JSON序列化/反序列化,只需要在配置文件中关闭缺失字段的默认值赋值逻辑即可,以application.yml为例:spring: jackson: deserialization: # 遇到JSON中存在、类中不存在的字段时不抛错,属于常规兼容配置 fail-on-unknown-properties: false mapper: # 核心配置:JSON中缺失的字段不赋予默认值,保持对象初始化的null状态 use-defaults-for-missing-properties: false - (可选)单类生效配置
如果不需要全局修改规则,只需要对MyClass类生效,可以直接在类上添加Jackson注解,无需修改全局配置:import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown = true) class MyClass { String a; String b; String c; Integer aa; }
效果验证
配置完成后传入示例请求体,最终生成的MyClass实例属性如下,完全符合需求:
- a:赋值为传入的"hallo"
- b:赋值为传入的"world"
- aa:赋值为传入的10
- c:未收到传参,值为null
内容的提问来源于stack exchange,提问作者EraZer
相关产品推荐
相关产品推荐

