java - Jersey (MOXy) 截断 JSON 日期

标签 java json jersey-2.0 moxy

我正在使用 Jersey 1.21.1,并且在解码日期时出现奇怪的行为。

我的 POJO 的简化版本:

@XmlRootElement
public class Invoice {
    private Date invoiceDate;
    private Date invoiceDate2;
}

我的资源方法:

@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Response putInvoice(Invoice invoice) { .. }

调用此服务的 JavaScript 代码使用 JSON.stringify 生成以下 HTTP 请求负载(根据 Chrome 调试器,这是实际发送的内容):

{"invoiceDate":"2015-10-27T04:00:00.000Z","invoiceDate2":"2015-10-27T08:00:00.000Z"}

到目前为止一切顺利。但是,当我在 putInvoice 内的断点处停下来并检查 Java 日期 invoice.invoiceDate 和 invoice.invoiceDate2 时,它们都具有相同的 fastTime:

1445904000000

(等于 UTC 时间 2015 年 10 月 27 日 12:00:00)。

我不知道为什么 Jersey/MOXy 似乎无法解析在我看来像是标准 ISO UTC 日期的内容。我只能假设我做错了什么或做了一个错误的假设。将不胜感激。

最佳答案

问题的根本原因是我的 POJO 日期字段被声明为 java.sql.Date,而不是 java.util.Date。当解码为 java.util.Date 时,ISO 格式确实被正确解析。

显而易见的解决方案是在 POJO 中使用 java.util.Date。但是,如果出于某种原因需要 java.sql.Date,您可以编写自定义 XmlAdaptor 来进行解析和格式化(请参阅此 SO 问题的答案:jaxb unmarshal timestamp)

其他评论:java.sql.Date 不能与开箱即用的 Jersey/MOXy 一起使用并不奇怪,但我确实发现具体的失败令人惊讶。坦率地说,我既期待又更喜欢类转换异常,就像我尝试编写自己的 XmlAdaptor 时遇到的异常一样。这就是我最终找出根本原因的方式。

由于 MOXy 截断了时间,我想知道这是否是因为默认日期时间解析中的异常导致 MOXy 退回到仅日期。但如果是这样,当原始逻辑不能时,回退如何成功分配给 java.sql.Date 呢?这是一个谜,但我不打算花时间在上面。 (编辑:这个解释可能是错误的——见评论)

关于java - Jersey (MOXy) 截断 JSON 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34440560/

相关文章:

java - 如何为测试类中的所有测试启动一次 Jersey 测试容器(Grizzly)?

java - 使用 libgdx 签名的 apk 问题

java - 如何测试LazyInitializationException?

java - import package.* 在 eclipse 中导入方法

java - 具有异步任务的 fragment 中的 ListView

java - 在 Jersey 上使用 mustache 模板

Java 应用程序在运行 Spring Boot 时可以工作,但不能与 Apache 一起工作

php - jQuery Ajax Json 响应 - 检查是否为 null

javascript - 如何从 s :hidden tag in Struts 2 获取 jQuery 中的对象列表

jersey - @DenyAll 被 Jersey (JAX-RS) 忽略