项目场景:
自动售卖机系统,对自动售卖机进行后台数据管理,并且与终端互联,后台可给终端下发消息。
问题描述
`生产环境,在一次升级之后,新建售货机时,无法创建对应的货道和料盒数据,导致客户不能正常配货,售卖商品。
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);
}
至此,修复了这个问题。
在自动售卖机系统的升级后,遇到新建售货机时无法创建货道和料盒数据的问题,原因是对象属性超过Fastjson反序列化限制的32个。通过分析,发现新增字段导致了该问题。解决方案是避免直接使用Fastjson转换,而是手动设置对象属性,从而修复了问题。
1568

被折叠的 条评论
为什么被折叠?



