给ShardingSphere提了个PR,不知道是不是嫌弃我
说来惭愧,干了 10 来年程序员,还没有给开源做过任何贡献,以前只知道嘎嘎写,出了问题嘎嘎改,从来没想过提个 PR 去修复他,最近碰到个问题,发现挺简单的,就随手提了个 PR 过去。
问题
问题挺简单的,就是在使用 mybatis 和 ShardingSphere 的时候,有人在 model 类使用了 OffsetDateTime 这个时间类型,发现会报错。
Caused by: java.lang.ClassCastException: class java.sql.Timestamp cannot be cast to class java.time.OffsetDateTime (java.sql.Timestamp is in module java.sql of loader 'platform'; java.time.OffsetDateTime is in module java.base of loader 'bootstrap')
at org.apache.ibatis.type.OffsetDateTimeTypeHandler.getNullableResult(OffsetDateTimeTypeHandler.java:38)
at org.apache.ibatis.type.OffsetDateTimeTypeHandler.getNullableResult(OffsetDateTimeTypeHandler.java:28)
at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:85)
... 99 more
这就是一个简单的类型转换的异常,于是跟着源码看了下,先看到BaseTypeHandler#getResult这个方法,实际上就是根据列名返回查询结果。

根据调用关系,找到了OffsetDateTimeTypeHandler实现类。

发现最终会调用rs.getObject()这个方法,那么其实这个方法会最终走到由 ShardingSphere 实现的 getObject方法中。

看到这里的时候其实已经明白了为啥会报错了,Shardingsphere 只判断了几个LocalDateTime等类型,对于这个比较特殊的时间类型没有处理,最终会转换成 Timestamp ,然后强转就报错了。

最后调用到ResultSetUtil#convertTimestampValue方法,可以看到确实是这样哈。

那如果修改源码的话其实很简单了,getObject判断多加一个,convertTimestampValue再加一个,就这样很简单啊。
@Override
public <T> T getObject(final int columnIndex, final Class<T> type) throws SQLException {
if (BigInteger.class.equals(type)) {
return (T) BigInteger.valueOf(getLong(columnIndex));
} else if (Blob.class.equals(type)) {
return (T) getBlob(columnIndex);
} else if (Clob.class.equals(type)) {
return (T) getClob(columnIndex);
} else if (LocalDateTime.class.equals(type) || LocalDate.class.equals(type) || LocalTime.class.equals(type) || OffsetDateTime.class.equals(type)) {
return (T) ResultSetUtil.convertValue(mergeResultSet.getValue(columnIndex, Timestamp.class), type);
} else {
return (T) ResultSetUtil.convertValue(mergeResultSet.getValue(columnIndex, type), type);
}
}
private static Object convertTimestampValue(final Object value, final Class<?> convertType) {
Timestamp timestamp = (Timestamp) value;
if (LocalDateTime.class.equals(convertType)) {
return timestamp.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
if (LocalDate.class.equals(convertType)) {
return timestamp.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
if (LocalTime.class.equals(convertType)) {
return timestamp.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
}
if (OffsetDateTime.class.equals(convertType)) {
return timestamp.toInstant().atZone(ZoneId.systemDefault()).toOffsetDateTime();
}
return value;
}
修复
最开始我其实并不想改源码,我在想其他的实现方案,搜索后发现引入一个包就可以解决,也就是 mybatis 的 JSR310 规范。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.1</version>
</dependency>
他为什么能解决这个问题?我看了下他的包里面的代码,这不就是加了个 TypeHandler 自己处理了嘛。

再去看了下 OffsetDateTimeTypeHandler的实现,其实就是自己就解决了,直接给返回OffsetDateTime ,根本不会走到 ShardingSphere 的逻辑里面去,这也就是他能解决这个问题的原因了。

当然,如果不想那么麻烦引入一个包,也可以单独把他拎出来自己去指定一下,这个很简单,就不多说了。
提PR
于是我想,这事情这么简单,我不如提个 PR 给官方吧,这里教下大家怎么提 PR 。
因为不是咱们的项目,是没法 push 代码的,所以进入到项目,然后fork,fork 好了以后,直接把项目 clone 下来,然后执行命令。
git remote add upstream https://github.com/apache/shardingsphere.git
通过命令我们可以看到成功了,这样就 OK了,然后正常拉分支写代码吧。

写完之后,正常去我们的项目界面提交 PR,然后就可以了。

麻烦
当然,过程并没有这么顺利,虽然说只是很简单的修改。
首先,这个校验就给我提示错误了,第一点叫我不要用 *号去引用。

这个其实是 IDEA的锅,如果引用同一个包下类过多的话,会自动帮我们转成星号,这个我们可以在Editor-Code Style-Java,然后找到 Imports 下的这两个选项,把他们都改成 99 就可以了,防止他自动给我们改成星号。

还有一些其他的比如 if 后面没跟空格之类的,这是我忘记格式化了!
然后大佬回复觉得看不下去,这代码太恶心了,说我们是不是可以用java.time.temporal.TemporalAccessor来判断,不然这么多时间类型,搞个毛线呢。
然后我就翻译了一段英文,我也不知道大佬看没看懂,我告诉他,这个不好整啊,你看这个接口啊,很多乱七八糟的类实现了他,实际上我觉得我们覆盖常用的一些就行了,其他的特殊时间类型让他们自己用 TypeHandler 处理吧。
大佬说,嗯当然,没办法判断这个接口那我们也没辙了,我说那不可就是嘛。

其实,还有很多时间类型他都会报错的,最好的办法这个都抽象出来和Mybatis单独用实现类,不过那样的话就得大工作了,我太懒了,就这样。
。。。
时间过去了几天,看了下他还没合我代码,是不是嫌弃我?

给ShardingSphere提了个PR,不知道是不是嫌弃我的更多相关文章
- Windows PR提权
目录 提权利用的漏洞 PR提权 提权利用的漏洞 Microsoft Windows RPCSS服务隔离本地权限提升漏洞 RPCSS服务没有正确地隔离 NetworkService 或 LocalSer ...
- 如何参与开源项目 - 细说 GitHub 上的 PR 全过程
目录 一.概述 二.为什么要参与开源项目 三.为什么我想介绍如何 PR 四.我想参与开源项目,怎么开始? 4.1.寻找一个合适的开源项目 4.2.寻找贡献点 五.我要提交 PR,怎么上手? 5.1.第 ...
- webshell提权20种思路
1,SER-TU提权(通常是利用SERFTP服务器管理工具,首先要在安装目录下找到INI配置文件,必须具备可写入的权限)2,RADMIN提权(大家并不陌生,我们在扫描4899空口令后,同样需要他来连接 ...
- 记一次FileZillaServer提权
前段时间检测一个企业网站,在检测该企业的一个下属公司的网站时通过用户名admin和密码123456进入了后台,后台目录就是公司汉语拼音+admin,诸如xxxadmin这种形式的.在后台通过“产品图片 ...
- 记一次Apache Carbondata PR的经历
前言 前段时间有幸接触到Apache Carbondata,试用过程中发现了一个小小的问题,并且又很快的定位到了问题.然后在社区群里反映了下,负责人问愿不愿意提个JIRA,PR,然后我在没有任何开源 ...
- Billu_b0x2内网渗透(多种提权方法)靶场-vulnhub
个人博客阅读体验更佳 本次来试玩一下vulnhub上的Billu_b0x2,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题.靶场推荐使用N ...
- ShardingSphere 集成 CosId 实战
背景 在软件系统演进过程中,随着业务规模的增长 (TPS/存储容量),我们需要通过集群化部署来分摊计算.存储压力. 应用服务的无状态设计使其具备了伸缩性.在使用 Kubernetes 部署时我们只需要 ...
- 有关UITableViewCell的侧滑删除以及使用相关大神框架MGSwipeTableCell遇到的小问题
提起笔,却不知道从何写起了,今天一整天都耗费在了这个可能根本不算是问题的小问题上,至今仍有一种蛋蛋的忧桑..(噢,不是提笔,是键盘手T_T) 表格视图在项目中就像是每日的家常便饭,在cell上添加侧滑 ...
- [前端] 记录工作中遇到的各种问题(Bug,总结,记录)
最近一年,在开发实践过程中遇到了不少问题,大多都能得到解决 部分知其原理,部分只能做到解决问题,而半年前遇到的问题,或多或少都忘得差不多了 是该记录一下一些问题,防止再遇到就得再查资料了 1. 浏览器 ...
随机推荐
- 前端工作中用到的openlayers相关的公共方法
/** * 获取地图上的图层对象 * @param map 地图对象 * @param layerName 实例化图层时的name * @return {null}*/ getLayerByLayer ...
- 数字化转型之数字资产知识库(springboot+es+vue+neo4j)
前言 在数字化高度普及的时代,企事业机关单位在日常工作中会产生大量的文档,例如医院制度汇编,企业知识共享库等.针对这些文档性的东西,手工纸质化去管理是非常消耗工作量的,并且纸质化查阅难,易损耗,所以电 ...
- rpm 系 linux 系统中 repo 文件中的 $release 到底等于多少?
rpm 系 linux 系统中 repo 文件中的 $release 到底等于多少? 结论 对于 8 来说,通过以下命令 #/usr/libexec/platform-python -c 'impor ...
- 基于swiftadmin极速后台开发框架,我制作了菜鸟教程[专业版]
由于互联网上基础编程教学的文档和视频教程已经有很多了,为什么还要建立菜鸟教程网, 这是因为基于我个人在十余年的自学编程的道路上.,我能深刻的体会到一名新手 在入门编程的时候,门槛在哪里,痛点在哪里?很 ...
- UiPath存在元素Element Exists的介绍和使用
一.Element Exists的介绍 使您能够验证UI元素是否存在,即使它不可见,输出的是一个布尔值 二.Element Exists在UiPath中的使用 1. 打开设计器,在设计库中新建一个Se ...
- css-sticky 定位
前言 我们大多都了解绝对定位.相对定位.static 和 fixed 定位,而 sticky 定位常常会被忽略,本文来总结一下其相关使用方法. 正文 1.常见使用效果 我们滚动滚动条时,当 " ...
- NC20439 [SHOI2017]期末考试
NC20439 [SHOI2017]期末考试 题目 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布.第 \(i\) 位同学希望在第 \ ...
- 关于使用netstat -lantup查看的SSHD 6010端口解释
关于使用netstat -lantup查看的SSHD 6010端口解释: 1.使用netstat -lantup查看当前系统开启的服务端口 tcp6 0 0 ::1:6010 ...
- 攻防世界MISC进阶区 52-55
52.Excaliflag 得到一张png,扔进stegsolve中查看,找到flag 53.Just-No-One 得到一个exe,运行后居然是一个安装程序,看了一下没什么问题,扔进ida pro中 ...
- ShardingSphere 云上实践:开箱即用的 ShardingSphere-Proxy 集群
本次 Apache ShardingSphere 5.1.2 版本更新为大家带来了三大全新功能,其中之一即为使用 ShardingSphere-Proxy chart 在云环境中快速部署一套 Shar ...