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