使用JAXB编组LocalDate

我正在构建一系列链接类,其实例我希望能够编组为XML,因此我可以将它们保存到文件中,稍后再读取它们。

目前我使用以下代码作为测试用例:

import javax.xml.bind.annotation.*; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.time.LocalDate; public class LocalDateExample { @XmlRootElement private static class WrapperTest { public LocalDate startDate; } public static void main(String[] args) throws JAXBException { WrapperTest wt = new WrapperTest(); LocalDate ld = LocalDate.of(2016, 3, 1); wt.startDate = ld; marshall(wt); } public static void marshall(Object jaxbObject) throws JAXBException { JAXBContext context = JAXBContext.newInstance(jaxbObject.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(jaxbObject, System.out); } } 

XML输出是:

     

startDate元素为空是否有原因? 我希望它包含日期的字符串表示(即toString() )。 为了做到这一点,我是否需要编写自己的代码?

java -version的输出是:

 openjdk version "1.8.0_66-internal" OpenJDK Runtime Environment (build 1.8.0_66-internal-b17) OpenJDK 64-Bit Server VM (build 25.66-b17, mixed mode) 

你必须像这样创建一个XmlAdapter

 public class LocalDateAdapter extends XmlAdapter { public LocalDate unmarshal(String v) throws Exception { return LocalDate.parse(v); } public String marshal(LocalDate v) throws Exception { return v.toString(); } } 

并使用注释你的领域

  @XmlJavaTypeAdapter(value = LocalDateAdapter.class) 

如果要在包级别定义适配器,另请参阅javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters

http://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.html描述了孔设置。

Joda-Time提供了Java SE中当前提供的日期和日历类的替代方法。 由于它们是在单独的库中提供的,因此JAXB不为这些类提供默认映射。

为包中的所有文件注册适配器。 您可以在要注册的包中添加package-info.java。

 @XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type=LocalDate.class, value=LocalDateAdapter.class), }) package PACKAGE_NAME; import java.time.LocalDate; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters; 

适配器看起来像:

 import javax.xml.bind.annotation.adapters.XmlAdapter; import java.time.LocalDate; public class LocalDateAdapter extends XmlAdapter{ public LocalDate unmarshal(String v) throws Exception { return LocalDate.parse(v); } public String marshal(LocalDate v) throws Exception { return v.toString(); } }