Java Jersey(MOXy)截断JSON日期

Java Jersey(MOXy)截断JSON日期,java,json,jersey-2.0,moxy,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) { ..

我使用的是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调试器,这是实际发送的):

{“发票日期”:“2015-10-27T04:00:00.000Z”,“发票日期2”:“2015-10-27T08:00:00.000Z”}

到目前为止还不错。但是,当我在
putInvoice
中的断点处停下来检查Java dates invoice.invoiceDate和invoice.invoiceDate2时,它们都有相同的fastTime:

144590400000

(等于2015年10月27日UTC上午12:00:00)


我不明白为什么泽西/莫西似乎无法解析在我看来像标准ISO UTC日期的数据。我只能假设我做错了什么或做出了错误的假设。非常感谢您的帮助。

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

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

附加注释:
java.sql.Date
不适用于Jersey/MOXy开箱即用,这并不奇怪,但我确实发现具体的失败令人惊讶。坦率地说,我希望并且更喜欢类转换异常,就像我试图编写自己的
XMLAdapter
时遇到的那样。这就是我最终找到根本原因的原因


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

我以前应该注意到的另一点:Jersey+MOXy在封送java.sql.Date时执行完全相同的截断。也就是说,当我对资源执行HTTP GET时,日期字符串没有时间组件或时区,例如“2015-12-15”。所以我在上面的推测是,这是由异常处理无意中造成的,这似乎是错误的。它是一致的,因此感觉是故意的,但我无法解释为什么会这样对待java.sql.Date。