2021-01-04

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

  1. Re:群晖DS218+部署GitLab
    大佬,麻烦问下内存是哪个牌子的吗?可以私信连接吗?
    –a403828237
  2. Re:Flink SQL Client综合实战
    老师您好,我是开源中国的内容志愿者李艳,想跟您聊聊内容合作,能否加下您的微信或qq给您详细说明下
    –爱吃甜品的女孩
  3. Re:K8S的Kafka监控(Prometheus+Grafana)
    666呀!
    –monkey’s
  4. Re:K8S的Kafka监控(Prometheus+Grafana)
    @通用C#系统架构 谢谢您的反馈…
    –程序员欣宸
  5. Re:K8S的Kafka监控(Prometheus+Grafana)
    非常好的文章,整套能搭建起来很棒。
    –通用C#系统架构
    Top Posts
  6. 树莓派4B安装64位Linux(不用显示器键盘鼠标)(12377)
  7. 设置IntelliJ IDEA支持lambda表达式(7393)
  8. Jenkins流水线(pipeline)实战之:从部署到体验(2604)
  9. 树莓派4B安装docker-compose(64位Linux)(2136)
  10. 让docker中的mysql启动时自动执行sql(2127)
    推荐排行榜
  11. Jenkins把GitHub项目做成Docker镜像(3)
  12. GitLab CI构建SpringBoot-2.3应用(2)
  13. springboot的jar为何能独立运行(2)
  14. 设置非root账号不用sudo直接执行docker命令(2)
  15. 群晖DS218+部署mysql(2)
    Copyright © 2021 程序员欣宸
    Powered by .NET 5.0 on Kubernetes
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值