Kubernetes官方java客户端之二:序列化和反序列化问题
2021-06-11 01:05
标签:details tail api 断点 k8s tree命令 mamicode 逻辑 cti https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等; 本文是《Kubernetes官方java客户端》的第二篇,在进入编码实战章节之前,有个问题需要大家有足够的了解,避免在后面的实战中耗费精力处理此类问题,来看看究竟是什么问题: SpringBoot是常用的应用框架,《Kubernetes官方java客户端》系列的应用都是基于SpringBoot-2.3.1版本的; 下图是SpringBoot-2.3.1.RELEASE的官方文档,红框表明默认的JSON处理库是Jackson: 看到这里您是否有种不祥预感:K8S官方java客户端是谷歌的,涉及到JSON处理时会不会首选自家的Gson? V1HTTPGetAction.java是java客户端中常用到的数据结构,用来封装http请求相关的参数,来看看其源码,如下图,果然用上了Gson的注解: 上图提到的IntOrString类要重点关注,用处广泛,打开其源码如下图,请记下红框2中的代码,后面提到的问题就来源于此: 上述代码运行起来,在浏览器访问该接口时,控制台抛出以下错误,IntOrString.getStrValue方法,就是前面咱们看过的那段,IntOrString中实际上保存的是int数据,但是Jackson执行了其getStrValue方法: 至于为什么Jackson会执行getStrValue方法,篇幅原因就不在此展开了,简单提一下,在java客户端的BeanPropertyWriter类中,选择方法的逻辑如下图,红框中展示了判定逻辑,此处getStrValue方法命中了该逻辑,如果您尝试用在红框处打上断点观察,会发现有很多方法都符合此条件: 我这里,解决问题的思路有两个: 问题解决起来并不难,先看SpringBoot-2.3.1.RELEASE官方文档: 结合官方文档,我们要做两件事情:欢迎访问我的GitHub
问题场景
复现问题
@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;
}
解决问题的思路
解决问题
dependency>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-starter-webartifactId>
exclusions>
exclusion>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-starter-jsonartifactId>
exclusion>
exclusions>
dependency>
- 建议您执行mvn dependency:tree命令细看整个项目的依赖树,确保jackson依赖已经全部去掉;
- 再次运行上述项目,如下图,服务端不再报错,页面上返回数据正常:
使用Jackson的场景
-
上述方式虽然可行,但并非所有项目都能坚持使用Gson而放弃Jackson,对于使用Jackson的项目,请避免Jackson参与K8S官方java客户端bean的序列化和反序列化操作,以上面出现的Controller代码为例,不要直接将V1PodList实例返回,您可以选择先用Gson序列化成JSON字符串,再返回字符串给前端,也可以自己定义VO对象,将V1PodList实例转成VO对象再返回;
-
至此,使用K8S官方java客户端之前要注意的问题已经弄明白了,接下来的进入精彩的实战章节吧,一起体验kubernetes官方为java程序员精心准备的工具;
你不孤单,欣宸原创一路相伴
- Java系列
- Spring系列
- Docker系列
- kubernetes系列
- 数据库+中间件系列
- DevOps系列
Kubernetes官方java客户端之二:序列化和反序列化问题
标签:details tail api 断点 k8s tree命令 mamicode 逻辑 cti
原文地址:https://www.cnblogs.com/wjxzs/p/14235930.html
上一篇:Spring中的循环依赖解决详解
下一篇:【JS设计模式】装饰者模式
文章标题:Kubernetes官方java客户端之二:序列化和反序列化问题
文章链接:http://soscw.com/essay/93379.html