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

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

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...