https://github.com/zq2599/blog_demos前端
內容:全部原創文章分類彙總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;java
本文是《Kubernetes官方java客戶端》的第二篇,在進入編碼實戰章節以前,有個問題須要你們有足夠的瞭解,避免在後面的實戰中耗費精力處理此類問題,來看看到底是什麼問題:git
SpringBoot是經常使用的應用框架,《Kubernetes官方java客戶端》系列的應用都是基於SpringBoot-2.3.1版本的;程序員
下圖是SpringBoot-2.3.1.RELEASE的官方文檔,紅框代表默認的JSON處理庫是Jackson:
github
看到這裏您是否有種不祥預感:K8S官方java客戶端是谷歌的,涉及到JSON處理時會不會首選自家的Gson?web
V1HTTPGetAction.java是java客戶端中經常使用到的數據結構,用來封裝http請求相關的參數,來看看其源碼,以下圖,果真用上了Gson的註解:
spring
上圖提到的IntOrString類要重點關注,用處普遍,打開其源碼以下圖,請記下紅框2中的代碼,後面提到的問題就來源於此:
shell
@RequestMapping(value = "/hello") public V1PodList hello() throws Exception { // 存放K8S的config文件的全路徑 String kubeConfigPath = "/Users/zhaoqin/temp/202007/05/config"; // 以config做爲入參建立的client對象,能夠訪問到K8S的API Server ApiClient client = ClientBuilder .kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))) .build(); Configuration.setDefaultApiClient(client); CoreV1Api api = new CoreV1Api(); // 調用客戶端API取得全部pod信息 V1PodList v1PodList = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null); return v1PodList; }
上述代碼運行起來,在瀏覽器訪問該接口時,控制檯拋出如下錯誤,IntOrString.getStrValue方法,就是前面我們看過的那段,IntOrString中實際上保存的是int數據,可是Jackson執行了其getStrValue方法:
數據庫
至於爲何Jackson會執行getStrValue方法,篇幅緣由就不在此展開了,簡單提一下,在java客戶端的BeanPropertyWriter類中,選擇方法的邏輯以下圖,紅框中展現了斷定邏輯,此處getStrValue方法命中了該邏輯,若是您嘗試用在紅框處打上斷點觀察,會發現有不少方法都符合此條件:
json
我這裏,解決問題的思路有兩個:
問題解決起來並不難,先看SpringBoot-2.3.1.RELEASE官方文檔:
結合官方文檔,咱們要作兩件事情:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </exclusion> </exclusions> </dependency>
上述方式雖然可行,但並不是全部項目都能堅持使用Gson而放棄Jackson,對於使用Jackson的項目,請避免Jackson參與K8S官方java客戶端bean的序列化和反序列化操做,以上面出現的Controller代碼爲例,不要直接將V1PodList實例返回,您能夠選擇先用Gson序列化成JSON字符串,再返回字符串給前端,也能夠本身定義VO對象,將V1PodList實例轉成VO對象再返回;
至此,使用K8S官方java客戶端以前要注意的問題已經弄明白了,接下來的進入精彩的實戰章節吧,一塊兒體驗kubernetes官方爲java程序員精心準備的工具;
微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos