繁体   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