【问题标题】:Can JAXB handle java.time objects?JAXB 可以处理 java.time 对象吗?
【发布时间】: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 以处理这种新的内置数据类型?

【问题讨论】:

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


    【解决方案1】:

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

    jTextTime library 解决了这个问题。

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

    如果您不想单独注释每个类,则可以按照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
      猜你喜欢
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      相关资源
      最近更新 更多