【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 替代。避免陷阱。

 

posted @ 2025-05-13 15:15  Angel挤一挤  阅读(45)  评论(0)    收藏  举报