【问题标题】:Jersey (MOXy) truncating JSON datesJersey (MOXy) 截断 JSON 日期
【发布时间】:2016-03-30 04:14:24
【问题描述】:

我正在使用 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

(相当于 2015 年 10 月 27 日凌晨 12:00:00 UTC)。

我不知道为什么 Jersey/MOXy 似乎无法解析在我看来像标准 ISO UTC 日期的内容。我只能假设我做错了什么或做出了错误的假设。非常感谢您的帮助。

【问题讨论】:

    标签: java json jersey-2.0 moxy


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我之前应该注意到的其他内容:Jersey + MOXy 在编组 java.sql.Date 时执行完全相同的截断。也就是说,当我对资源执行 HTTP GET 时,日期字符串没有时间组件或时区,例如'2015 年 12 月 15 日'。所以我上面的推测,这是由异常处理无意造成的,似乎是错误的。它是一致的,因此感觉是经过深思熟虑的,但我无法解释为什么 java.sql.Date 会被这样对待。
    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 2017-03-10
    • 2015-02-08
    相关资源
    最近更新 更多