【发布时间】:2016-06-24 16:14:41
【问题描述】:
我遇到了一个使用 Jersey 和 Gson 进行 JSON 序列化/反序列化的小 servlet 的奇怪问题。实际上,我复制粘贴了为泽西岛编写的基本 Gson 提供程序,例如:http://eclipsesource.com/blogs/2012/11/02/integrating-gson-into-a-jax-rs-based-application/,一切似乎都工作正常,直到我尝试反序列化一个日期(采用标准 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 方法,但这并没有改变任何东西。
我认为还有其他一些实现 MessageBodyWriter 和 MessageBodyReader 的类覆盖了我自己的实现,所以我试图删除我自己的实现,Jersey 抱怨它无法反序列化 JSON(所以没有其他供应商,我猜)。
我试图在我的MessageBodyReader 的readFrom 方法中设置断点,但请求实际上是在没有暂停执行的情况下反序列化的。
我应该提到我的类也包含不同的字段,一些字符串和一个日期:字符串总是被正确反序列化。
我尝试发送不同的日期,从2016-06-23T00:00:00.000+0200 开始(应该使用我在上面代码中使用的日期格式字符串进行格式化),然后通过删除一个部分来获得简单的2016-06-17,然后从来没有工作过。
我清理了我的 maven 项目,重新编译它,但它没有工作。
我认为可能是 Jetty 没有加载正确的类,所以我将相同的代码部署到 Tomcat 8 服务器中,结果是一样的。
我最后一次尝试是编写另一个并行的MessageBodyReader,但我没有将它设为通用Object 类型,而是创建了一个特定的java.util.Date 反序列化器,但似乎仍然没有调用readFrom 方法。
我真的不知道我现在可以尝试什么,你知道吗?
提前致谢。
【问题讨论】:
标签: java json jersey jax-rs gson