簡體   English   中英

Jersey + Gson未反序列化java.util.Date

[英]Jersey + Gson not deserializing java.util.Date

我遇到了一個小小的servlet奇怪的問題,它使用Jersey和Gson進行JSON序列化/反序列化。 我實際上復制粘貼了為Jersey編寫的基本Gson提供程序,如下所示: http : //eclipsesource.com/blogs/2012/11/02/integrating-gson-into-a-jax-rs-based-application/和一切似乎都正常,直到我嘗試反序列化Date(以標准ISO 8601格式),該Date始終以null映射到我的POJO中。

我的第一次嘗試是在返回gsonBuilder實例之前注冊一個反序列化類型的適配器,如下所示:

import java.util.Date;

...

gsonBuilder.registerTypeAdapter(Date.class,
    new JsonDeserializer<Date>() {
        @Override
        public Date deserialize(JsonElement json, Type type,
                                JsonDeserializationContext arg2) throws JsonParseException {
            try {
                System.out.println(json);
                return (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXX")).parse(json.getAsString());
            } catch (ParseException e) {
                return null;
            }
        }
    });

這不起作用,並且在我發送POST請求時沒有打印出任何內容。 在返回它之前,我嘗試在gsonBuilder實例上使用setDateFormat方法,但這沒有任何改變。

我以為還有其他一些類實現MessageBodyWriterMessageBodyReader重寫了我自己的實現,因此我嘗試刪除自己的實現,Jersey抱怨說它無法反序列化JSON(所以我想沒有其他提供程序了)。

我試圖在MessageBodyReaderreadFrom方法中設置斷點,但實際上該請求已反序列化,而不會暫停執行。

我應該提到我的課程也包含不同的字段,一些字符串和一個日期:該字符串始終正確反序列化。

我嘗試發送不同的日期,從2016-06-23T00:00:00.000+0200 (應使用我在上面的代碼中使用的日期格式字符串進行格式化),然后通過刪除一個來獲得簡單的2016-06-17當時,它從未奏效。

我清理了我的Maven項目,重新編譯了它,但是它沒有用。

我認為可能是Jetty沒有加載正確的類,所以我將相同的代碼部署到Tomcat 8服務器中,結果是相同的。

我的最后一次嘗試是編寫另一個並行的MessageBodyReader但沒有使它對Object類型通用,而是制作了一個特定的java.util.Date反序列化器,但似乎未調用readFrom方法。

我真的不知道我現在可以嘗試什么,你有什么主意嗎?

提前致謝。

錯誤的原因在這里...

 try {
     System.out.println(json);
     return (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXX")).parse(json.getAsString());
 } catch (ParseException e) {
     return null;
 }

在這里更具體:

“ yyyy-MM-dd'T'HH:mm:ss.SSSXX”

java Date和SimpleParser最多只能容納3個毫秒,並且用於SimpleDateFormat的字符串中沒有通配符.SSS XX ,因此您的解析器將引發異常,您正在捕獲但返回了一個引用到的Date空,Ergo:

Gson正在處理空引用的對象,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM