You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中非标准Getter命名的变量无法返回问题咨询

为什么非标准Getter命名isToBeClosedResult会导致JSON序列化缺失字段?

这个问题的核心在于JavaBean规范和Spring默认使用的Jackson序列化器对属性的推断逻辑,我来给你详细拆解:

问题回顾

你定义了一个RemoveHoldPayload实体类,其中包含String类型的字段toBeClosedResult:

  • 当你使用非标准Getter命名isToBeClosedResult()时,接口返回的JSON中缺失了toBeClosedResult字段;
  • 改成标准的getToBeClosedResult()后,该字段正常出现在响应JSON里。

你提供的错误场景返回示例:

{ "autoHolds": null, "manualHolds": null, "incidentId": null, "comment": null, "commentType": null, "error": null, "toBeClosed": false, "closeStatusCode": 0, "commentId": null }

原因分析

Spring Boot默认使用Jackson作为JSON序列化工具,而Jackson是严格遵循JavaBean规范来识别类的属性与对应的Getter/Setter的,核心规则如下:

  • 对于非boolean类型的属性,规范要求Getter命名必须以get开头,格式为get[属性名首字母大写],比如字段toBeClosedResult(String类型)对应的标准Getter是getToBeClosedResult();
  • 对于boolean类型的属性,规范允许两种Getter格式:is[属性名首字母大写](更常用)或get[属性名首字母大写],比如你代码里的boolean toBeClosed字段,用isToBeClosed()作为Getter就能被正确识别,所以toBeClosed字段能正常出现在JSON中。

当你给String类型的字段使用is开头的Getter时,会触发两个错误的推断:

  1. Jackson默认认为is开头的Getter对应的是boolean类型的属性;
  2. 但你的类中并没有boolean类型的toBeClosedResult字段,只有String类型的同名字段,类型不匹配导致Jackson无法将Getter与字段关联起来,最终序列化时会跳过这个字段,所以JSON中看不到toBeClosedResult。

如果你的错误Getter还存在返回类型不匹配(比如public String isToBeClosedResult()),这会进一步违背JavaBean规范,Jackson更无法正确识别这个属性。

代码验证

看你提供的实体类代码,当把Getter改成标准格式后:

public String getToBeClosedResult() {
    return toBeClosedResult;
}

Jackson会按照规范正确识别这是String类型字段toBeClosedResult的Getter,因此会将该字段的值序列化到JSON响应中。

总结

要避免这类序列化问题,务必严格遵循JavaBean的命名规范:

  • 非boolean类型属性:Getter用getXxx,Setter用setXxx;
  • boolean类型属性:Getter优先用isXxx,Setter用setXxx。

这样Jackson才能准确映射类的属性,保证序列化和反序列化的正确性。

内容的提问来源于stack exchange,提问作者test dummy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:07:52