项目场景:
自动售卖机系统,对自动售卖机进行后台数据管理,并且与终端互联,后台可给终端下发消息。
问题描述
`生成环境,在一次升级之后,新建售货机时,无法创建对应的货道和料盒数据,导致客户不能正常配货,售卖商品。
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);
}
至此,修复了这个问题。
原文地址:https://www.jb51.cc/wenti/3280353.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。