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