我正在使用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:
14459.04亿
(等于2015年10月27日上午12:00:00 UTC)。
我不知道为什么Jersey / MOXy似乎无法解析我所看到的标准ISO UTC日期。我只能假设我做错了什么或做出了错误的假设。非常感谢帮助。
答案 0 :(得分:2)
问题的根本原因是我的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
开箱即用的泽西/ MOXy不起作用并不令人惊讶,但我确实发现特定的失败令人惊讶。坦率地说,我会同时期望并首选一个类转换异常,就像我在尝试编写自己的XmlAdaptor
时得到的那样。这就是我最终找出根本原因的方法。
由于MOXy截断时间,我想知道是否因为默认日期时间解析中的异常导致MOXy仅回落到日期。但如果是这样的话,当原始逻辑不能时,该回退如何成功分配给java.sql.Date
?这是一个谜,但不是我计划花的时间。 (编辑:这个解释可能是错误的 - 见评论)