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

时间:2014-06-16 19:54:39

标签: java xml jaxb java-8 java-time

我知道JAXB (Java Architecture for XML Binding)可以编组/解组java.util.Date对象,如this answer by Blaise Doughan中所示。

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

2 个答案:

答案 0 :(得分:22)

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

实际上,在参考实现中有一个issue与此相关。

您需要创建并使用XmlAdapter来处理这些类型。使用与此帖子Joda-Time中描述的JAXB and Joda-Time: Dates and Times类似的方法。

您可以使用this implementation of adapters for java.time

答案 1 :(得分:0)

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

jTextTime library解决了这个问题。

该库围绕JDK8 OffsetXXX日期/时间类,因为它们是XML模式类型datedateTimetime的(唯一)自然等效项。

像这样使用:

添加依赖项:

<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
        ....
    }
}

如果您不想单独注释每个类,则可以按照here中的说明使用包级注释。

如果您使用xjc工具从XSD文件生成Java类,则为also explained