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

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

  • 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管理的,应该会避免此类问题

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

相关推荐