記一個因爲依賴管理糟糕踩的坑

public void someMethod(long uid){
    set.add(uid);
    po.setString(JSON.toJSONString(set));
}// 這段代碼是web項目的,online會調用複製代碼
  • someMethod(long)很簡單,就是將存儲 uid 的 Set<Long> 經過 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的版本,推測緣由有二java

    • 其一File#compareTo(File pathname)最後調用的仍是String#CaseInsensitiveComparator#compare(String, String)linux

    • 其二因爲該排序是 linux 默認的,因此 classloader 加載的時候會判斷,若是已經加載過同包同名的 class,則不加載後者web

  • 綜上所述,其實這個問題就是依賴管理糟糕的坑,至於爲何線上 online 會有兩個 fastjson我也問了運維,歷史緣由。可是,若是是用 maven之類的依賴管理工具的話,應該會避免此類問題json

後續:仍是想搞清楚到底怎麼回事!運維

下面兩個圖是在加載 jre\lib\ett\*.jar 的時候的斷點,經過線程的棧幀和棧幀中的數據,很明顯證實個人推測一是正確的,爲個人直覺感到欣慰!maven


相關文章
相關標籤/搜索