Spring Boot项目GET接口响应返回多余字段的原因求解
问题产生原因
Spring Boot 默认使用 Jackson 框架完成 Java 对象到 JSON 响应的序列化,该问题是 Jackson 序列化规则和实体类命名不规范共同导致的,具体原因如下:
- Jackson 默认序列化规则:
- 会自动将所有 public 修饰的 getter 方法识别为待序列化字段,字段名是 getter 方法去掉
get前缀后首字母小写的结果 - 被序列化注解(比如你代码中的
@JsonFormat)修饰的成员变量,也会被 Jackson 识别为待序列化字段直接输出
- 会自动将所有 public 修饰的 getter 方法识别为待序列化字段,字段名是 getter 方法去掉
- 对应你的实体类代码:
- 私有成员变量
private Date date被@JsonFormat(pattern = "yyyy-MM-dd")修饰,Jackson 会直接识别该字段,按指定格式输出,对应响应中的"date": "2021-09-12" - 你定义的 public getter 方法
public Date getDatetime()符合 Jackson getter 识别规则,会被自动映射为datetime字段,该方法没有加格式化注解,所以输出 Date 类型默认的 ISO 时间格式,对应响应中的"datetime": "2021-09-12T16:01:04.000+00:00"
- 私有成员变量
推荐解决方案
你可以根据自己的业务需求选择以下任意一种方案修复:
- 方案1:统一实体类 getter/setter 命名和属性名匹配,将
getDatetime()改为getDate()、setDateTime()改为setDate(),此时 Jackson 只会识别到date一个字段,不会生成多余字段 - 方案2:如果不想改动现有 getter/setter 命名,在
getDatetime()方法上添加@JsonIgnore注解,让 Jackson 忽略该方法的序列化逻辑 - 方案3:在 Booking 实体类上添加注解
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE),关闭 getter 自动识别逻辑,仅序列化显式声明了序列化注解的字段
内容的提问来源于stack exchange,提问作者ban29
相关产品推荐
相关产品推荐

