摘要:錯誤描述在中,使用進行進行序列化時,得到錯誤。相關(guān)關(guān)鍵字,解決問題。翻譯由以下異常引起在方法上該方法位于的行發(fā)生了異常。原因找到了,但無論是還是,都不是我們自已維護的。在相關(guān)資料的學(xué)習(xí)中,并沒有找到統(tǒng)一配置的路徑。
錯誤描述:
在springboot中,使用進行net.sf.json.JSONObject.fromObject(javaObject)進行json序列化時,得到錯誤Caused by:java.lang.IllegalArgumentException at java.sql.Date.getHours(Date.java:187)。
最終解決方案:自定義轉(zhuǎn)換器,并注入至轉(zhuǎn)換方法。
我們解決問題的順序如下:
翻譯
依據(jù)翻譯和現(xiàn)實情況,嘗試解決問題。
看官方文檔,或是方法描述,嘗試解決問題。
google相關(guān)關(guān)鍵字,解決問題。
翻譯由以下異常引起:在java.sql.Date.getHours方法上(該方法位于Data.java的187行)發(fā)生了java.lang.IllegalArgumentException異常。
其中:Illegal:非法的, Argument:論據(jù)
現(xiàn)實情況是我們并沒有主動調(diào)用這個getHour()方法,所以猜想,應(yīng)該是net.sf.json.JSONObject.fromObject(javaObject)進行json序列化時,主動調(diào)用了該方法。
通過打斷點的方式,我們在fromObject(javaObject)本行A、下一行B、java.sql.Date.getHours的187行C,分別打一個斷點,最終發(fā)現(xiàn)執(zhí)行順序為:A->C->異常。符合我們的猜想預(yù)期。
如果是A->B->C->異常,則說明并不是由A觸發(fā)的C,也就證明我們的猜想是錯誤的。你可以參與下文來快速的找到執(zhí)行過程。
原因找到了,但無論是net.sf.json.JSONObject.fromObject(javaObject)還是java.sql.Date.getHours,都不是我們自已維護的。所以得到結(jié)論:兩者在進行配合時發(fā)生了沖突,當(dāng)前解決方法則只能棄用一方,或是向一方注入配置,來繞過java.sql.Date.getHours方法的調(diào)用。
看方法描述我們找到java.sql.Date.getHours()方法:
/** * This method is deprecated and should not be used because SQL Date * values do not have a time component. * * @deprecated * @exception java.lang.IllegalArgumentException if this method is invoked * @see #setHours */ @Deprecated public int getHours() { throw new java.lang.IllegalArgumentException(); }
基本的意思就是說,這個方法已經(jīng)棄用了,因為:sql.Date只是精確到日,根本就沒有hour這說,所以你想得到小時,這當(dāng)然不行了。原來問題出在net.sf.json.JSONObject.fromObject(javaObject)上,當(dāng)其轉(zhuǎn)換sql.Date時,調(diào)用了不該調(diào)用已棄的getHour()方法,所以觸發(fā)了這個異常。
結(jié)論:好像誰都沒有錯。第一個的原則是:只要你有getXXX()我就調(diào)用,保證對所有的get方法全部序列化。第二個的原則是:雖然我歷史上有過getHour()方法,但是這個方法根本就不應(yīng)該被調(diào)用,我的最小精確度是天,你問我是幾小時,我哪知道,所以你調(diào)用我,我就報出異常。
按我們以往的經(jīng)驗,一些牛氣的第三方庫,是會給用戶提供一些重寫的接口的接口的,比如我們在項目啟動時,向net.sf.json的特定接口,注入一個Bean,該Bean的作用是:重寫sql.Date的json序列化方法。
在相關(guān)資料的學(xué)習(xí)中,并沒有找到統(tǒng)一配置的路徑。但是可以在轉(zhuǎn)換前,定義JsonConfig,并將自定義的轉(zhuǎn)換器裝配進行。但我認為每次都這樣新建一個轉(zhuǎn)換器,太麻煩了。所以后面,又嘗試了一些其它的方法,最后,沒有辦法,其它的方法都是曲線救國,最終還是繞到了定義轉(zhuǎn)換器的路上來了。
實際開發(fā)中,我還嘗試使用排除@Deprecated的方法,該方法會得到一個其它的我們不想得到的結(jié)果,不再詳細闡述;已嘗試了將sql.Date換成util.Date,雖然能夠序列化,但序列化后的內(nèi)容并不是我們想要的,進行請求數(shù)據(jù)綁定時,會得到400錯誤,不在闡述
使用轉(zhuǎn)換器前:
JSONObject jsonObject = JSONObject.fromObject(mandatoryInstrument);
使用轉(zhuǎn)換器后:
jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(Date.class, new JsonValueProcessor() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd"); @Override public Object processArrayValue(Object o, JsonConfig jsonConfig) { return simpleDateFormat.format(o); } @Override public Object processObjectValue(String s, Object o, JsonConfig jsonConfig) { if (o != null) { return simpleDateFormat.format(o); } else { return null; } } }); JSONObject jsonObject = JSONObject.fromObject(mandatoryInstrument, jsonConfig);結(jié)論
在學(xué)習(xí)一門新技術(shù)的時候或是新的問題的時候,上來直接看官方文檔是不現(xiàn)實的,需要結(jié)合google找到關(guān)鍵點,然后再結(jié)合關(guān)鍵點來學(xué)習(xí)特定的官方文檔,最后達到解決問題并且能夠理解自己所解決問題的根本原因的目的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72080.html
摘要:一般來說,這種單例實現(xiàn)有兩種思路,私有構(gòu)造器,枚舉。而這種方式又分了飽漢式,餓漢式。通過關(guān)鍵字防止指令重排序。什么是單例?為什么要用單例? 一個類被設(shè)計出來,就代表它表示具有某種行為(方法),屬性(成員變量),而一般情況下,當(dāng)我們想使用這個類時,會使用new關(guān)鍵字,這時候jvm會幫我們構(gòu)造一個該類的實例。而我們知道,對于new這個關(guān)鍵字以及該實例,相對而言是比較耗費資源的。所以如果我們能夠想...
摘要:換句話說,環(huán)境或應(yīng)用程序沒有處于請求操作的適當(dāng)狀態(tài)。項目中異常分析引發(fā)崩潰日志的流程分析解決辦法常見的出現(xiàn)場景狀態(tài)異常非法線程操作。導(dǎo)致的方法出來顯示消息位于該消息之后,遲遲沒有執(zhí)行。這時候,的超時檢測結(jié)束,刪除了服務(wù)中的記錄。 目錄介紹 1.1 java.lang.UnsatisfiedLinkError找不到so庫異常 1.2 java.lang.IllegalStateExce...
摘要:項目中異常分析引發(fā)崩潰日志的流程分析解決辦法常見的出現(xiàn)場景狀態(tài)異常非法線程操作。引發(fā)崩潰日志的流程分析解釋如下所示,釋放與此位圖關(guān)聯(lián)的本機對象,并清除對像素數(shù)據(jù)的引用。 目錄介紹 1.1 java.lang.UnsatisfiedLinkError找不到so庫異常 1.2 java.lang.IllegalStateException非法狀態(tài)異常 1.3 android.conten...
摘要:最近一直在做底層方面的研究,所以這段時間就沒寫相關(guān)的東西,但恰巧今天同事問我一個問題,在幫他解決完這個問題之后,我發(fā)現(xiàn),這個問題對新手來說還是非常容易犯的,所以在這里記錄下。首先看下面這段代碼這段代碼的功能就是對進行排序,內(nèi)元素類型是。 最近一直在做底層方面的研究,所以這段時間就沒寫java相關(guān)的東西,但恰巧今天同事問我一個問題,在幫他解決完這個問題之后,我發(fā)現(xiàn),這個問題對java新手...
閱讀 2341·2021-11-23 10:09
閱讀 2904·2021-10-12 10:11
閱讀 2608·2021-09-29 09:35
閱讀 1353·2019-08-30 15:53
閱讀 2276·2019-08-30 11:15
閱讀 2922·2019-08-29 13:01
閱讀 2305·2019-08-28 18:15
閱讀 3376·2019-08-26 12:13