微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

记一次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);
                }

至此,修复了这个问题。

原文地址:https://www.jb51.cc/wenti/3280353.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐