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

Posted

技术标签:

【中文标题】JAXB 可以处理 java.time 对象吗?【英文标题】:Can JAXB handle java.time objects? 【发布时间】:2014-08-06 17:17:21 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

jTextTime library 解决了这个问题。

该库围绕 JDK8 OffsetXXX 日期/时间类,因为它们是 XML Schema 类型 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。

【讨论】:

【参考方案2】:

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

确实,参考实现中有一个与此相关的issue。

您需要创建并使用XmlAdapter 来处理这些类型。使用与Joda-Time 类似的方法,如本文JAXB and Joda-Time: Dates and Times 中所述。

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

【讨论】:

那篇文章是关于Joda-Time。您是说 JAXB 尚未针对新的内置 java.time 对象进行更新,我需要类似于处理 Joda-Time 的东西吗? @BasilBourque - JAXB 尚未更新以支持 java.time 类型。适配器的实现将类似于链接的博客文章。 还有一个Java 8的实现:github.com/migesok/jaxb-java-time-adapters

以上是关于JAXB 可以处理 java.time 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

CXF+JAXB处理复杂数据

从 xsd 生成 c++ 类的 JAXB 等效项?

处理JAXB中的嵌套元素

Java_数据交换_JAXB_用法入门

Jaxb处理泛型,转化成xml字符串

JAXB 可以在基类中初始化值吗?