目录
前言
论如何深挖一个bug。结合代码食用更佳。
过程
这是一个报表。使用的是API数据集,URL带有两个参数。(由于保密因素在这里无法给大家更具体的展示)
一切准备就绪后。保存、预览。发现数据无法展示。
问题排查
第一步我先跟着官网的一些教程排查了一下API数据集的配置,但没有发现任何问题
第二步在确认API数据集配置无误后,我检查了一下提供数据的接口,但依旧无法找到问题
第三步到这一步已经黔驴技穷了,内心吐槽第一次使用API数据集怎么就直接翻车了,然后直到我闲着没事按F12的时候看到了积木报表的这个接口
调试
show接口提供用于渲染报表的数据。当下不就是我们API接口返回的数据它渲染不出来么?
所以直接本地调试!
在查看积木报表的日志中,发现了一个fastjson解析的报错。
凭着实事求是的想法,我尝试的定位了一下这个报错的位置。
在此期间我尝试了无数次Download Sources想要下载一个比较完整的代码,但是无论我在哪种网络环境下都下载不了,点了没反应。也就只能卑微的根据反编译出来的源码一步步排查了。
可以看到,报错的这一行去解析了一下一个在代码中叫做“var10”的变量。 这个时候我们只要知道它到底解析了什么样的字符串而报错就可以继续排查下去了。
可问题来了,在这样的反编译环境下怎么知道这个“var10”是什么样的值呢?
此时,神圣的“alt+鼠标左键”再也不能为我找到那个属性的值。那这下子该怎么办呢?每当这个时候就需要请出我们神圣的“ctrl+鼠标左键”!定位这个“var10”的位置!
映入眼帘的是一些对字符串的处理,第一眼就注意到了"data"、"links"、"total"、"count"这些字符串,我的脑海里积木报表官网的教程一闪而过:
我记得containsKey这个方法是寻找一个Map中是否有对应的key。那么它应该就在寻找这些对应的键然后去做相应处理。
再来看一下var10值的情况,默认值为一个空的字符串,然后判断这个JSONObject有没有"links"这个key,如果有再做赋值处理,没有的话var10就只剩空字符串了。
很显然,代码无情的跳过了唯一一个在var10被解析之前的赋值。也就是说解析var10其实只是在解析空字符串而已。
那么。为什么JSONArray.parseObject()这个方法解析空字符串会抛异常呢?
实事求是,继续调试!把这一行代码单独拎出来放在单元测试里运行!
怪了...不是解析空字符串会报错吗?为什么这一次就运行成功了呢?难道是我的推测有误吗?
带着灵魂三连问,左思右想。最后我注意到了一个细节:
在做测试之前,我自己项目的fastjson是我刚刚加的,所以它是最新的版本!
而我公司项目的版本则是:
高下立判!我的版本是最新一版,公司的是旧版,有可能是阿里已在高版本中修复了解析空字符串导致空指针报错的问题!
根据推测,我把我的依赖版本降为1.2.55。再次运行:
推测正确!与公司项目的报错如出一辙!
解决
现在虽然知道升级fastjson能够解决问题,而这一空指针问题早已在1.2.62版本中解决。但是我知道升级依赖可能会导致一些让人头大的问题,所以我决定尝试"锦上添花"!
在之前的推导过程中,我们知道,这次积木报表中的解析报错是因为var10的值是空字符串。而var10的值又是被一个叫"links"的属性所影响,那么假设我们在API数据集的接口中额外提供一个叫做"links"的空数组,让var10至少包含一些字符,会不会就能解决这个解析报错的问题呢?会不会就直接能够正常的让报表展示数据呢?
在接口上把它加上去
运行然后检查API数据集的数据(仅做演示,所以这些属性暂时不会有任何值):
更新代码然后重新预览报表试试:
成功了!有数据了!用这种方式能够在避免升级依赖的情况下解决这个问题!
结束语
呃...请问有没有人知道这个"links"属性是做什么的?这个积木报表我不太熟悉...(不太熟悉积木报表的官方文档)
还有,这个fastjson报错提示的"EOF"是什么意思?求各路大神指教!