摘要:使用的序列化是的,而對于類的反序列化的源碼如下這里我們可以清楚地看出來,將讀取到的轉為然后調用了方法,那么如果我們的屬性為空,那么調用函數必然會拋異常,也就產生了之后的結果。補充說明我找到的源碼可以看出,對于,,的反序列化均有問題存在。
背景
這是我之前提的問題:問題鏈接
在使用dubbo 2.5.3的時候,定義的接口中有一個方法使用了實體類作為參數,而這個實體類中定義了一個變量為java.sql.Time類型。不妨暫且定義接口如下:
//BusinessDto中有一個屬性dealTime 為java.sql.Time類型 String queryBusiness(BusinessDto param);
當消費者調用這個接口的時候,如果param中的dealTime為null,那么在提供者那里接收到的整個param都為null,如果這個屬性不為null,那么參數可以正常的傳遞。
問題原因解析問題出在反序列化的時候。
dubbo使用的序列化是hession2的,而hession2對于Time類的反序列化的源碼如下:
static class SqlTimeFieldDeserializer extends FieldDeserializer { private final Field _field; SqlTimeFieldDeserializer(Field field) { _field = field; } void deserialize(AbstractHessianInput in, Object obj) throws IOException { java.sql.Time value = null; try { java.util.Date date = (java.util.Date) in.readObject(); value = new java.sql.Time(date.getTime()); _field.set(obj, value); } catch (Exception e) { logDeserializeError(_field, obj, value, e); } } }
這里我們可以清楚地看出來,將in讀取到的object轉為Date然后調用了getTime方法,那么如果我們的dealTime屬性為空,那么調用getTime函數必然會拋異常,也就產生了之后的結果。
補充說明我找到的源碼可以看出,對于 java.sql.Date, java.sql.Timestamp, java.sql.Time的反序列化均有問題存在。
static class SqlDateFieldDeserializer extends FieldDeserializer { private final Field _field; SqlDateFieldDeserializer(Field field) { _field = field; } void deserialize(AbstractHessianInput in, Object obj) throws IOException { java.sql.Date value = null; try { java.util.Date date = (java.util.Date) in.readObject(); value = new java.sql.Date(date.getTime()); _field.set(obj, value); } catch (Exception e) { logDeserializeError(_field, obj, value, e); } } } static class SqlTimestampFieldDeserializer extends FieldDeserializer { private final Field _field; SqlTimestampFieldDeserializer(Field field) { _field = field; } void deserialize(AbstractHessianInput in, Object obj) throws IOException { java.sql.Timestamp value = null; try { java.util.Date date = (java.util.Date) in.readObject(); value = new java.sql.Timestamp(date.getTime()); _field.set(obj, value); } catch (Exception e) { logDeserializeError(_field, obj, value, e); } } } static class SqlTimeFieldDeserializer extends FieldDeserializer { private final Field _field; SqlTimeFieldDeserializer(Field field) { _field = field; } void deserialize(AbstractHessianInput in, Object obj) throws IOException { java.sql.Time value = null; try { java.util.Date date = (java.util.Date) in.readObject(); value = new java.sql.Time(date.getTime()); _field.set(obj, value); } catch (Exception e) { logDeserializeError(_field, obj, value, e); } } }
而hessian4 則修復了這個問題,在調用getTime之前做了非空判斷,如果為空則把這個屬性賦null而不是產生異常。
如果已經開始大規模的使用那么不妨使用別的類型,繞過這三個類型即可避免這個問題。
總結問題來源于同事隨口問的一個小問題,挺感興趣就一直糾纏了下來,發現問題還是挺嚴重的,另外借用同事的一句話,不再維護的開源軟件真的挺危險。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70074.html
摘要:就是默認的序列化器和反序列化器。最后,那為什么會到這一步呢發現拿到反序列化器后會執行一個操作基本上就到這里了,最主要的原因還是方法,并不是很多博文說的。 ????首先交代背景,前幾天遇到一個小bug,由于其他系統的一個DTO子類和父類有一個字段名重復了,所以導致我set的子類字段那邊拿不到值。改起來很簡單嘛,讓對面把子類的字段刪掉就好,但是拿不到值的原因讓我想了很久,很明顯是序列化和反...
摘要:大揭秘目標了解的新特性,以及版本升級的引導。四元數據改造我們知道以前的版本只有注冊中心,注冊中心的有數十個的鍵值對,包含了一個服務所有的元數據。 DUBBO——2.7大揭秘 目標:了解2.7的新特性,以及版本升級的引導。 前言 我們知道Dubbo在2011年開源,停止更新了一段時間。在2017 年 9 月 7 日,Dubbo 悄悄的在 GitHub 發布了 2.5.4 版本。隨后,版本...
摘要:當提供程序線程池耗盡時,不能發送到使用者端。一些錯誤修正動態配置不能刪除,支持參數,監控統計問題等新功能支持手冊線程池耗盡時自動堆棧轉儲。在注冊表無法連接時被阻止。正常關機,在注冊表取消注冊和線程池關閉之間增加額外的等待時間。 dubbo分析showImg(https://segmentfault.com/img/bVbam2f?w=1726&h=686); dubbo為什么要對接sp...
摘要:修正了在上的部分修正了比如協議中序列化的問題。配置文件在配置配置在目錄下面配置后的工程基本目錄結構在項目 雜七雜八的雜 個人博客: 呆萌的程序猿原文:dubbox/dubbo+spring+mybatis+gradle構建REST服務聲明:由于sf的編輯自動校驗,導致某些英文單詞出錯,例如:gradle被編輯器自動替換為grade,jdk替換為idk等,查看的時候,請自行翻譯。 ---...
摘要:前言到今天為止,正好是工作一年了。一年里有過折磨痛苦,有過成就感,一年后很欣慰能看到自己是有所收獲的。自己做出了一件很棒的事情完全可以拿去和別人炫耀,比如你用了一個很好的設計模式,比如你優化了一個功能讓他快了倍,比如你開發了一個很棒的工具。 前言 到今天為止,正好是工作一年了。一年里有過折磨痛苦,有過成就感,一年后很欣慰能看到自己是有所收獲的。記錄如下,如有不當,還望指點。 技術 看...
閱讀 3695·2021-11-19 09:56
閱讀 1476·2021-09-22 15:11
閱讀 1136·2019-08-30 15:55
閱讀 3382·2019-08-29 14:02
閱讀 2922·2019-08-29 11:07
閱讀 442·2019-08-28 17:52
閱讀 3180·2019-08-26 13:59
閱讀 445·2019-08-26 13:53