记一个由于依赖管理糟糕踩的坑
-
public void someMethod(long uid){ set.add(uid); po.setString(JSON.toJSONString(set)); } // 这段代码是web项目的,online会调用
-
someMethod(long)很简单,就是将存储uid的Set
通过fastjson转成String咋一看没什么问题,但是在反序列化的时候,uid会默认为Integer这个时候就有问题了.所以需要改成 JSON.toJSONString(set, SerializerFeature.WriteClassName)
这样的String就是Set[1234567890L]那么反序列化也OK了 -
改完之后本地确实没有问题,上线后web也没问题,但是online在反序列化的时候就报错了
com.alibaba.fastjson.JSONException: exepct '[', but error
查了半天,最后怀疑线上online的jar包有问题,联系运维查了下online的classpath,不出所料,当时内心十分日狗
-
这里又关系到class的加载问题,但是很明显online用的是1.1.2的版本,推测原因有二
- 其一
File#compareTo(File pathname)
最后调用的还是String#CaseInsensitiveComparator#compare(String, String)
- 其二由于该排序是linux默认的,所以classloader加载的时候会判断,如果已经加载过同包同类的class,则不加载后者
- 其一
-
综上所述,其实这个问题就是依赖管理糟糕的坑,至于为什么线上online会有两个fastjson,我也问了运维,历史原因.但是,如果是用maven管理的,应该会避免此类问题