当前位置: 首页 > 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.dtcms.com/a/402982.html

相关文章:

  • 从 ZooKeeper 到 ELK:分布式中间件与日志分析系统全解析
  • 专业视频修复软件,简单操作效果好
  • 微信小程序开发小白入门指南
  • 商标设计网站是哪个烟台网站公司
  • 卖狗做网站什么关键词最好成都做网站
  • 自然语言处理——情感分析 <上>
  • 网站开发 一眼网站开发人员名片
  • uniapp手机端调试基座版本号为4.76, 版本号相同,跳过基座更新
  • vue核心原理实现
  • 在docker中容器使用iptables限制IP访问端口
  • iOS 26 耗电检测实战攻略,如何测电量掉速、定位高耗能模块与优化策略(适用于 uni-app 原生 App)
  • uniapp+<script setup lang=“ts“>解析后端返回的图片流并将二维码展示在页面中
  • 1- 十大排序算法(选择排序、冒泡排序、插入排序)
  • uniapp x 鸿蒙开发之调试证书签名配置
  • RabbitMQ-消息堆积
  • uniapp x鸿蒙开发之运行到鸿蒙模拟器
  • wordpress建站 外贸适合做装饰公司的名字
  • Web3实操:2025年DePIN 挂机项目要点分享
  • 公司做网站费用wordpress alchem
  • 内存对齐与变量/结构体分析
  • 常见开发语言在 Windows 上的默认编码格式
  • 卫朋:AI硬件产品怎么做?——雷达模块选型实操
  • 从另一个视角看Transformer:注意力机制就是可微分的k-NN算法
  • [优选算法专题三.二分查找——NO.21山脉数组的峰顶索引]
  • 湖南营销型网站建设推广如何更改网站标题
  • 云原生网络基础设施的核心组件Envoy
  • KubeSphere 社区版即将发布:开启云原生新篇章
  • K8s学习笔记(五) Velero结合minnio业务数据备份与恢复
  • 23种设计模式——组合模式(Composite Pattern)
  • 培训机构网站开发汉中杨海明