当前位置: 首页 > news >正文

Java 字段命名避坑: success和isSuccess

前几天开发时踩了个坑,前端拿不到 isSuccess 的值,调接口看返回也确实有数据,排查了半天才发现是字段命名的问题。今天就把这个踩坑过程整理出来,希望能帮大家少走弯路。

Java Bean 的 getter/setter 规范

  • 普通类型比如 int、String 这些,getter 是 getXxx (),setter 是 setXxx ()。就像 username 字段,对应 getUsername () 和 setUsername (),这部分大家基本都熟。
  • 布尔类型不一样,规范里 getter 是 isXxx () 而不是 getXxx ()。比如 success 这个布尔字段,getter 应该是 isSuccess (),setter 还是 setSuccess ()。

这个规则本身没问题,但当布尔字段名自带 is 前缀时,矛盾就出现了。

下面就是笔者踩中的坑

当时定义了一个接口返回结果类,想着让字段名直观些,就给布尔字段加了 is 前缀:

public class Result {// 布尔字段带is前缀private boolean isSuccess;private String message;// IDE自动生成的getter/setterpublic boolean isSuccess() {return isSuccess;}public void setSuccess(boolean success) {this.isSuccess = success;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

当后端返回Result对象时,

  • 对于getMessage():去掉get前缀,首字母小写 → JSON 字段名为message(符合预期);
  • 对于isSuccess():去掉is前缀,首字母小写 → JSON 字段名为success而非字段名isSuccess)。

最终序列化后的 JSON 是这样的:

{"success":true,"message":"操作成功"}

前端开发按字段名isSuccess接收数据(比如response.isSuccess),那自然对应不上, 也就接收不到数据了

为什么序列化工具依赖 getter 而非字段名?

后来查了下才明白,这和 Java 的封装思想有关:

  • 字段通常是private修饰的,外部本就不该直接访问,序列化工具尊重封装原则;
  • 灵活性更高:可以通过自定义 getter 修改序列化结果。例如字段isVip,可通过isMember() getter 让 JSON 显示member字段。

解决方案:

最佳实践:布尔字段去掉 is 前缀

这是最符合规范、零成本的方案。将isSuccess改为success,其他代码不变:

public class Result {// 布尔字段不带is前缀private boolean success;private String message;// getter/setterpublic boolean isSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}// ...其他方法
}

此时序列化后的 JSON 为{"success":true,"message":"操作成功"},前后端直接用success对接即可,完美契合直觉。

自定义 getter 方法

public class Result {private boolean isSuccess;private String message;// 自定义getter,方法名改为getIsSuccess()public boolean getIsSuccess() {return isSuccess;}public void setSuccess(boolean success) {this.isSuccess = success;}// ...其他方法
}

序列化工具会解析getIsSuccess():去掉get前缀 → JSON 字段名为isSuccess。但这种方式不符合 Java Bean 规范,不推荐优先使用。

http://www.gsyq.cn/news/11171.html

相关文章:

  • 跨端边云时序数据管理新范式:Apache IoTDB 的 DB+AI 融合之道 - 实践
  • PHP 与 Java 的终极对比:2025年,开发者该如何选择? - 详解
  • 银行同业存单的信用等级
  • go-reids
  • WSL,适用于 Linux 的 Windows 子系统
  • 学财税大信息应用,需要考CPA/税务师吗?
  • APM v4.1.1 | 免费音乐听歌B站油管音乐播放器 - 指南
  • 安装与卸载JDK8
  • Linux zdb -C (zfs Debugger调试器)
  • 从零开始实现简易版Netty(八) MyNetty 实现Small规格的池化内存分配
  • 解题报告-字符串(str.*)
  • Linux 系统中的 /dev/disk/by-id/目录作用详解
  • 3.HTTP/HTTPS:报文格式、技巧、状态码、缓存、SSLTLS握手
  • keepalived服务器
  • 封神台复现
  • 李之一的Java第一作
  • 第三篇
  • 基于cloacked-pixel隐写工具爆破项目
  • redis 大 key 优化。哈罗面试:redis 有个大 key需要在线优化, 不能影响现有业务,请求不能大量到库,怎么优化?
  • ACL高可用架构。希音面试:第三方挂了,我们总在背锅。来一 靠谱的 高可用方案,让 外部依赖 稳如泰山
  • 【星海随笔】RabbitMQ开发篇 - 教程
  • Playwright MCP 服务器对比高层级的 MCP 服务器解决方案 - 详解
  • P13754 【MX-X17-T3】Distraction
  • 初学汇编
  • C++、Java 和 Python 在输入输出差别
  • 用 Java 和 Tesseract 进行验证码识别:基础实现与优化
  • 详细介绍:【2025PolarCTF秋季个人赛】WEB方向wp
  • 普通用户之间免密互信时因权限问题致使配置失败
  • 深入解析:[p2p-Magnet] docs | HTTP API与Web界面 | 搜索查询引擎
  • P10004 [集训队互测 2023] Permutation Counting 2