【Java】【FastJSON】java pojo中定义的getXxx方法 使用FastJson出现的null陷阱
生产报错如下:
java.lang.NullPointerException at com.XXX.ware.depotinventory.domain.DepotInventory.getVirtualAvailableStock(DepotInventory.java:794) at com.alibaba.fastjson.serializer.ASMSerializer_29_DepotInventory.write(Unknown Source) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:312) at com.alibaba.fastjson.JSON.toJSONString(JSON.java:793) at com.alibaba.fastjson.JSON.toJSONString(JSON.java:731) at com.alibaba.fastjson.JSON.toJSONString(JSON.java:688) at com.XXX.ware.depotinventory.pro.process.PhysicalStockMsgProcess.syncStock(PhysicalStockMsgProcess.java:467)
报错源代码如下:
logger.info("sync physical stock: " + JSONObject.toJSONString(depotInventory));
而DepotInventory的类中有该代码:
但是DepotInventory类中并没有
VirtualAvailableStock属性!!!
public class DepotInventory extends BaseInventory { ... /** * 获取可用的虚拟库存 * @return */ public BigDecimal getVirtualAvailableStock(){ BigDecimal virtualAvailableStock = this.displayStore.subtract(this.displayStoreOccupy).subtract(this.safeStockNum); return virtualAvailableStock.compareTo(new BigDecimal(0)) < 0 ? new BigDecimal(0) : virtualAvailableStock; } }
报错原因:
1.在Fastjson中, JSONObject.toJSONString(Object) 方法的序列化逻辑默认会调用类中所有 public 修饰且以 get 开头的方法,并将这些方 法的返回值作为JSON对象的属性。这是Fastjson基于JavaBean规范设计的特性,但也是许多开发者容易忽略的"陷阱"。 2.未对 displayStore等相关属性做判空的处理
修改建议:
1. 字段判空 2.对 成员方法的定义,非必要不要用get开头 可以采用obtainXxx 替代。避免陷阱。

浙公网安备 33010602011771号