Jersey + Gson没有反序列化java.util.Date

时间:2016-06-24 16:14:42

标签: java json jersey jax-rs gson

我在使用Jersey和Gson进行JSON序列化/反序列化的小servlet时遇到了一个奇怪的问题。我实际上复制粘贴了为Jersey编写的基本Gson提供程序,就像这个:http://eclipsesource.com/blogs/2012/11/02/integrating-gson-into-a-jax-rs-based-application/并且一切似乎工作正常,直到我试图反序列化一个Date(标准ISO 8601格式),它总是被映射到我的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(所以没有其他提供商,我猜)。

我尝试在readFrom中的MessageBodyReader方法中设置断点,但实际上反序列化了请求而没有暂停执行。

我应该提一下,我的类也包含不同的字段,一些字符串和一个日期:字符串总是正确地反序列化。

我尝试发送不同的日期,从2016-06-23T00:00:00.000+0200开始(应使用我在上面的代码中使用的日期格式字符串格式化),并通过删除一个部分来获取简单的2016-06-17时间,它从来没有奏效。

我清理了我的maven项目,重新编译它并且它没有工作。

我认为它可能是Jetty没有加载正确的类,所以我将相同的代码部署到Tomcat 8服务器中,结果是一样的。

我的最后一次尝试是编写另一个并行MessageBodyReader,但不是将其设为Object类型的通用,而是制作了一个特定的java.util.Date反序列化器,仍然是readFrom方法似乎没有被调用。

我真的不知道我现在可以尝试什么,你有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

错误的原因在这里......

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

在这里更具体:

<强>&#34; YYYY-MM-DD&#39; T&#39; HH:MM:ss.SSSXX&#34;

java Date和SimpleParser最多只能容纳3个毫秒,并且在用于SimpleDateFormat的字符串中没有通配符.SSS XX ,所以你的解析器抛出异常,您正在捕获但返回引用为null的Date, 埃尔戈:

Gson正在处理一个空引用对象,