记一个由于依赖管理糟糕踩的坑

  • 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,不出所料,当时内心十分日狗
    fastjson.jar

  • 这里又关系到class的加载问题,但是很明显online用的是1.1.2的版本,推测原因有二

    • 其一File#compareTo(File pathname)最后调用的还是String#CaseInsensitiveComparator#compare(String, String)
    • 其二由于该排序是linux默认的,所以classloader加载的时候会判断,如果已经加载过同包同类的class,则不加载后者
  • 综上所述,其实这个问题就是依赖管理糟糕的坑,至于为什么线上online会有两个fastjson,我也问了运维,历史原因.但是,如果是用maven管理的,应该会避免此类问题

posted @ 2019-06-11 13:27  平湖  阅读(112)  评论(0编辑  收藏  举报