如何隐藏Java公共抽象类的getCount()方法不输出到JSON
实现方案
transient关键字仅作用于类成员字段,无法作用于方法级的Getter,要保留getCount()的业务调用能力同时隐藏序列化结果,直接使用对应JSON序列化框架的方法级忽略配置即可,以下是主流场景的具体实现:
1. 注解方案(最简便,推荐)
直接在抽象基类的getCount()抽象方法上添加序列化忽略注解,注解配置会被所有实现类自动继承,不需要修改实现类代码,完全不影响业务方法正常调用。
- 如果是SpringBoot默认的Jackson序列化框架:
在抽象方法上添加@JsonIgnore即可,示例代码:
实现类原有代码无需任何调整:import com.fasterxml.jackson.annotation.JsonIgnore; public abstract class Plan implements Comparable<Plan> { @Override public int compareTo(Plan that) { BigDecimal thisValue = this.getCount(); if (thisValue == null) { return 1; } BigDecimal thatValue = that.getCount(); if (thatValue == null) { return -1; } return thisValue.compareTo(thatValue); } @JsonIgnore // 序列化、反序列化均忽略该属性,注解自动被子类继承 public abstract BigDecimal getCount(); }@Override public final BigDecimal getCount() { if (exists != null) { return plan.getCount(); } return null; } - 如果是Fastjson/Fastjson2序列化框架:
在抽象方法上添加@JSONField(serialize = false, deserialize = false)即可,逻辑和上述Jackson方案一致。 - 如果是Gson序列化框架:
在抽象方法上添加@Expose(serialize = false, deserialize = false),同时配置GsonBuilder启用excludeFieldsWithoutExposeAnnotation模式即可。
2. 无侵入方案(不修改原有业务代码)
如果不想让业务代码耦合序列化框架的注解,可以使用框架的混入(Mixin)机制实现配置隔离,以Jackson为例:
- 单独定义混入配置类,不侵入原有Plan类:
abstract class PlanMixIn { @JsonIgnore abstract BigDecimal getCount(); } - 在序列化全局配置中注册混入关系:
ObjectMapper objectMapper = new ObjectMapper(); // 注册后所有Plan类(含子类)序列化时都会自动忽略getCount() objectMapper.addMixIn(Plan.class, PlanMixIn.class);
注意事项
- 不要为了隐藏序列化结果修改方法名(比如把
getCount()改成calculateCount()),会破坏JavaBean规范,提升后续代码维护成本。 - 如果是自定义序列化器场景,也可以直接在序列化规则中过滤名为
count的输出属性,效果和注解方案一致,但配置成本更高。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

