JAXB 可以处理 java.time 对象吗?
我知道JAXB(Java Architecture for XML Binding)可以封送/取消marshal java.util.Date对象,如Blaise Doughan的这个答案所示。
但是Java 8中新的java.time包对象呢,比如ZonedDateTime
呢?是否已更新 JAXB 以处理此新的内置数据类型?
我知道JAXB(Java Architecture for XML Binding)可以封送/取消marshal java.util.Date对象,如Blaise Doughan的这个答案所示。
但是Java 8中新的java.time包对象呢,比如ZonedDateTime
呢?是否已更新 JAXB 以处理此新的内置数据类型?
在 Java SE 8 中,JAXB 尚未更新以支持 java.time 类型。
实际上,在参考实现中存在与此相关的问题。
您需要创建并使用 XmlAdapter
来处理这些类型。使用类似于 Joda-Time 的方法,如本文、JAXB 和 Joda-Time: 日期和时间中所述。
您可以将此适配器实现用于 java.time。
我们无法使用已接受答案中链接的库,因为它掩盖了一个重要细节:在 XML 架构中,日期/时间值允许缺少时区偏移量。适配器必须能够处理这种情况。此外,还必须支持 Java 没有纯日期数据类型的事实。
jTextTime库解决了这个问题。
该库围绕 JDK8 日期/时间类展开,因为这些类是 XML 模式类型 和 的(唯一)自然等价物。OffsetXXX
date
dateTime
time
像这样使用:
添加依赖项:
<dependency>
<groupId>com.addicticks.oss</groupId>
<artifactId>jtexttime</artifactId>
<version> ... latest ...</version>
</dependency>
为类添加注释:
public class Customer {
@XmlElement
@XmlJavaTypeAdapter(OffsetDateTimeXmlAdapter.class)
@XmlSchemaType(name="dateTime")
public OffsetDateTime getLastOrderTime() {
....
}
@XmlElement
@XmlJavaTypeAdapter(OffsetDateXmlAdapter.class)
@XmlSchemaType(name="date")
public OffsetDateTime getDateOfBirth() { // returns a date-only value
....
}
}
如果不想单独批注每个类,则可以使用包级批注,如此处所述。
如果您使用 xjc 工具从 XSD 文件生成 Java 类,那么这里也进行了说明。