记一次Fastjson反序列化问题

在自动售卖机系统的升级后,遇到新建售货机时无法创建货道和料盒数据的问题,原因是对象属性超过Fastjson反序列化限制的32个。通过分析,发现新增字段导致了该问题。解决方案是避免直接使用Fastjson转换,而是手动设置对象属性,从而修复了问题。

项目场景:

自动售卖机系统,对自动售卖机进行后台数据管理,并且与终端互联,后台可给终端下发消息。


问题描述

`生产环境,在一次升级之后,新建售货机时,无法创建对应的货道和料盒数据,导致客户不能正常配货,售卖商品。

JSONArray machineMaterialBoxArray = (JSONArray) json.get("machineMaterialBox");
            MachineMaterialBox machineMaterialBox;
            for (int i = 0; i < machineMaterialBoxArray.size(); i++) {
                machineMaterialBox = machineMaterialBoxArray.getObject(i,MachineMaterialBox.class);
                machineMaterialBox.setFictitious(false);
                machineMaterialBox.setCabinetNumber(cabinetNum);
                machineMaterialBox.setMaterialId(0);
                machineMaterialBox.setBalance(0);
                machineMaterialBox.setAlarm(0);
                machineMaterialBox.setBalance(0);
                machineMaterialBox.setWarning(0);

                machineMaterialBox.setSellEmptyTime(0);
                machineMaterialBox.setMachineAisleId(0);
                machineMaterialBox.setUpdateTime(DateUtils.getUnixTimestamp().intValue());
                machineMaterialBox.setCreateTime(DateUtils.getUnixTimestamp().intValue());
                machineMaterialBoxList.add(machineMaterialBox);
            }

原因分析:

通过排查,发现新建设备是在设备服务中创建好设备和货柜之后,会发送消息到商品服务,去创建对应的货道和料盒数据,打断点查看后,货道数据生成没有问题,问题出在了料盒数据创建上,在遍历Json数组直接转对象的时候报错了,java.lang.VerifyError,网上查询后发现是Fastjson反序列化时,当对象属性超过32个,就会出现这个问题,在上次升级时,我在MachineMaterialBox中加了一个新字段,导致对象属性超过32个,触发了这个问题。


解决方案:

网上的解决方案都是推荐升级Fastjson版本,可以彻底解决这个问题,但是由于刚来公司不久,对整体代码还没有完全熟悉,所以没有选择升级Fastjson版本,而是在代码上做了修改。

JSONArray machineMaterialBoxArray = (JSONArray) json.get("machineMaterialBox");
                MachineMaterialBox machineMaterialBox;
                for (int i = 0; i < machineMaterialBoxArray.size(); i++) {
                    JSONObject jsonObject = machineMaterialBoxArray.getJSONObject(i);
                    machineMaterialBox = new MachineMaterialBox();
                    machineMaterialBox.setCol(jsonObject.getInteger("col"));
                    machineMaterialBox.setRow(jsonObject.getInteger("row"));
                    machineMaterialBox.setMachineId(jsonObject.getInteger("machineId"));
                    machineMaterialBox.setMaterialBoxId(jsonObject.getInteger("materialBoxId"));
                    machineMaterialBox.setMachineCabinetId(jsonObject.getInteger("machineCabinetId"));
                    machineMaterialBox.setCapacity(jsonObject.getInteger("capacity"));
                    machineMaterialBox.setStatus(jsonObject.getInteger("status"));

                    machineMaterialBox.setFictitious(false);
                    machineMaterialBox.setCabinetNumber(cabinetNum);
                    machineMaterialBox.setMaterialId(0);
                    machineMaterialBox.setBalance(0);
                    machineMaterialBox.setAlarm(0);
                    machineMaterialBox.setBalance(0);
                    machineMaterialBox.setWarning(0);

                    machineMaterialBox.setSellEmptyTime(0);
                    machineMaterialBox.setMachineAisleId(0);
                    machineMaterialBox.setUpdateTime(DateUtils.getUnixTimestamp().intValue());
                    machineMaterialBox.setCreateTime(DateUtils.getUnixTimestamp().intValue());
                    machineMaterialBox.setAbnormalBalance(0);
                    machineMaterialBoxList.add(machineMaterialBox);
                }

至此,修复了这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值