成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java.lang.IllegalArgumentException at java.sql.Dat

X_AirDu / 2134人閱讀

摘要:錯誤描述在中,使用進行進行序列化時,得到錯誤。相關(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)實情況

現(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.Datejson序列化方法。

在相關(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

相關(guān)文章

  • 從未這么明白的設(shè)計模式(一):單例模式

    摘要:一般來說,這種單例實現(xiàn)有兩種思路,私有構(gòu)造器,枚舉。而這種方式又分了飽漢式,餓漢式。通過關(guān)鍵字防止指令重排序。什么是單例?為什么要用單例? 一個類被設(shè)計出來,就代表它表示具有某種行為(方法),屬性(成員變量),而一般情況下,當(dāng)我們想使用這個類時,會使用new關(guān)鍵字,這時候jvm會幫我們構(gòu)造一個該類的實例。而我們知道,對于new這個關(guān)鍵字以及該實例,相對而言是比較耗費資源的。所以如果我們能夠想...

    NikoManiac 評論0 收藏0
  • Android實際開發(fā)bug大總結(jié)

    摘要:換句話說,環(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...

    peixn 評論0 收藏0
  • 崩潰bug日志總結(jié)1

    摘要:項目中異常分析引發(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...

    Scott 評論0 收藏0
  • Java新手非常容易犯的一個錯誤

    摘要:最近一直在做底層方面的研究,所以這段時間就沒寫相關(guān)的東西,但恰巧今天同事問我一個問題,在幫他解決完這個問題之后,我發(fā)現(xiàn),這個問題對新手來說還是非常容易犯的,所以在這里記錄下。首先看下面這段代碼這段代碼的功能就是對進行排序,內(nèi)元素類型是。 最近一直在做底層方面的研究,所以這段時間就沒寫java相關(guān)的東西,但恰巧今天同事問我一個問題,在幫他解決完這個問題之后,我發(fā)現(xiàn),這個問題對java新手...

    niuxiaowei111 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<