JAXB 可以处理 java.time 对象吗?

2022-09-01 16:00:50

我知道JAXB(Java Architecture for XML Binding)可以封送/取消marshal java.util.Date对象,如Blaise Doughan的这个答案所示。

但是Java 8中新的java.time包对象呢,比如ZonedDateTime呢?是否已更新 JAXB 以处理此新的内置数据类型?


答案 1

在 Java SE 8 中,JAXB 尚未更新以支持 java.time 类型。

实际上,在参考实现中存在与此相关的问题

您需要创建并使用 XmlAdapter 来处理这些类型。使用类似于 Joda-Time 的方法,如本文、JAXB 和 Joda-Time: 日期和时间中所述。

您可以将此适配器实现用于 java.time


答案 2

我们无法使用已接受答案中链接的库,因为它掩盖了一个重要细节:在 XML 架构中,日期/时间值允许缺少时区偏移量。适配器必须能够处理这种情况。此外,还必须支持 Java 没有纯日期数据类型的事实。

jTextTime库解决了这个问题。

该库围绕 JDK8 日期/时间类展开,因为这些类是 XML 模式类型 和 的(唯一)自然等价物。OffsetXXXdatedateTimetime

像这样使用:

添加依赖项:

<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 类,那么这里也进行了说明


推荐