Return Home zq2599
CnBlogs Home New Post Contact Admin Subscription订阅 Posts - 131 Articles - 0 Comments - 21
Kubernetes官方java客户端之二:序列化和反序列化问题
欢迎访问我的GitHub
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中的代码,后面提到的问题就来源于此:
在这里插入图片描述
小结:SpringBoot默认的JSON处理类是Jackson,K8S官方java客户端内的Bean在涉及到JSON相关的序列化和反序列化处理时,使用了Gson注解,因此上述Bean实例在SpringBoot中涉及到JSON处理时,可能会有问题(这时只能说可能),例如RestController返回对象,会被Jackson转为JSON;
复现问题
这里用一个SpringBoot工程来演示此问题(该工程名为OutsideclusterApplication,下一篇文章会详细说明),如下代码是个http接口响应,可见V1PodList实例作为接口返回时,会被SpringBoot用Jackson转为JSON返回给前端:
@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方法命中了该逻辑,如果您尝试用在红框处打上断点观察,会发现有很多方法都符合此条件:
在这里插入图片描述
解决问题的思路
我这里,解决问题的思路有两个:
让Jackson在序列化的时候,能够调用正确的方法,以IntOrString为例,如果此时内部保存int型数据,就应该执行其getIntValue方法即可;
Bean中使用了Gson注释,就是打算用Gson来处理序列化和反序列化操作的,因此序列化和反序列化的地方都改用Gson处理;
上述两个思路,我选择了第二种,毕竟第一种太难了…
解决问题
问题解决起来并不难,先看SpringBoot-2.3.1.RELEASE官方文档:
在这里插入图片描述
结合官方文档,我们要做两件事情:
首先,classpath中有Gson,这个已经有了,因为K8S官方java客户端会依赖Gson;
其次,classpath中不要出现Jackson,为了达到这个目的我们需要做以下操作,排除spring-boot-starter-web的依赖(为什么不直接排除jackson的库呢?您可以执行mvn dependency:tree命令细看依赖树,会发现对jackson的依赖并非单一关系):
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-json
建议您执行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系列
欢迎关注公众号:程序员欣宸
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界…
https://github.com/zq2599/blog_demos
好文要顶 关注我 收藏该文
程序员欣宸
关注 - 4
粉丝 - 17
+加关注
0 0
« 上一篇: Kubernetes官方java客户端之一:准备
posted @ 2021-01-04 07:48 程序员欣宸 Views(14) Comments(0) Edit 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】有你助力,更好为你——博客园用户消费观调查,附带小惊喜!
【推荐】AWS携手博客园为开发者送福利,注册立享12个月免费套餐
【推荐】七牛云新老用户同享 1 分钱抢 CDN 1TB流量大礼包!
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【推荐】新一代 NoSQL 数据库,Aerospike专区新鲜入驻
相关博文:
· java反射
· java-反射
· java反射
· java 反射
· java反射
» 更多推荐…
最新 IT 新闻:
· Google Chrome浏览器地址栏即将变得更安全、更快速
· 百度地图推出“疫情小区”搜索功能
· 我国量子存储器取得重大进展!世界首次实现“按需读取”
· 2021「蛋壳」要彻底碎了?CFO 等高管相继离职,上市不满一年深陷暴雷风波
· 依图CTO颜水成被曝离职,已加入东南亚电商独角兽Shopee
» 更多新闻…
昵称: 程序员欣宸
园龄: 8年
粉丝: 17
关注: 4
+加关注
< 2021年1月 >
日 一 二 三 四 五 六
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6
Search
My Tags
CI(1)
DevOps(1)
GitLab(1)
java(1)
springboot(1)
PostArchives
2021/1(1)
2020/12(13)
2020/11(23)
2020/10(27)
2020/9(6)
2020/6(7)
2019/11(5)
2019/10(6)
2019/9(41)
2019/8(2)
Recent Comments
- Re:群晖DS218+部署GitLab
大佬,麻烦问下内存是哪个牌子的吗?可以私信连接吗?
–a403828237 - Re:Flink SQL Client综合实战
老师您好,我是开源中国的内容志愿者李艳,想跟您聊聊内容合作,能否加下您的微信或qq给您详细说明下
–爱吃甜品的女孩 - Re:K8S的Kafka监控(Prometheus+Grafana)
666呀!
–monkey’s - Re:K8S的Kafka监控(Prometheus+Grafana)
@通用C#系统架构 谢谢您的反馈…
–程序员欣宸 - Re:K8S的Kafka监控(Prometheus+Grafana)
非常好的文章,整套能搭建起来很棒。
–通用C#系统架构
Top Posts - 树莓派4B安装64位Linux(不用显示器键盘鼠标)(12377)
- 设置IntelliJ IDEA支持lambda表达式(7393)
- Jenkins流水线(pipeline)实战之:从部署到体验(2604)
- 树莓派4B安装docker-compose(64位Linux)(2136)
- 让docker中的mysql启动时自动执行sql(2127)
推荐排行榜 - Jenkins把GitHub项目做成Docker镜像(3)
- GitLab CI构建SpringBoot-2.3应用(2)
- springboot的jar为何能独立运行(2)
- 设置非root账号不用sudo直接执行docker命令(2)
- 群晖DS218+部署mysql(2)
Copyright © 2021 程序员欣宸
Powered by .NET 5.0 on Kubernetes