Jersey (MOXy) 截断 JSON 日期
Jersey (MOXy) truncating JSON dates
我正在使用 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) { .. }
调用此服务的 Java 脚本代码使用 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 AM UTC)。
我不知道为什么 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 一起使用并不奇怪,但我确实发现具体的失败令人惊讶。坦率地说,我既期待又更喜欢 class 转换异常,就像我尝试编写自己的 XmlAdaptor
时遇到的那样。这就是我最终找出根本原因的方式。
由于 MOXy 截断了时间,我想知道这是否是因为默认 date-time 解析中的异常导致 MOXy 退回到 date-only。但如果是这样,当原始逻辑不能时,回退如何成功分配给 java.sql.Date
?这是一个谜,但我不打算花时间在上面。 (编辑:这个解释可能是错误的——见评论)
我正在使用 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) { .. }
调用此服务的 Java 脚本代码使用 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 AM UTC)。
我不知道为什么 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 一起使用并不奇怪,但我确实发现具体的失败令人惊讶。坦率地说,我既期待又更喜欢 class 转换异常,就像我尝试编写自己的 XmlAdaptor
时遇到的那样。这就是我最终找出根本原因的方式。
由于 MOXy 截断了时间,我想知道这是否是因为默认 date-time 解析中的异常导致 MOXy 退回到 date-only。但如果是这样,当原始逻辑不能时,回退如何成功分配给 java.sql.Date
?这是一个谜,但我不打算花时间在上面。 (编辑:这个解释可能是错误的——见评论)