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 类型 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以上是关于JAXB 可以处理 java.time 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章