使用 JAXB 编组 LocalDate

2022-09-01 13:44:25

我正在构建一系列链接类,我希望能够将其实例编组为 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 输出为:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wrapperTest>
    <startDate/>
</wrapperTest>

元素为空的原因是什么?我希望它包含日期的字符串表示形式(即)。我需要编写一些自己的代码才能执行此操作吗?startDatetoString()

的输出为: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)

答案 1

你必须创建一个这样的:XmlAdapter

public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {
    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


答案 2

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

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

为包中的所有文件注册适配器。您可以在要注册的包中添加包信息.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<String, LocalDate>{

    public LocalDate unmarshal(String v) throws Exception {
        return LocalDate.parse(v);
    }

    public String marshal(LocalDate v) throws Exception {
        return v.toString();
    }

}

推荐