当前位置: 首页 > 面试题库 >

使用JAXB编组LocalDate

林俊英
2023-03-14
问题内容

我正在构建一系列链接的类,我希望它们的实例能够编组到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>

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<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是否要在程序包级别定义适配器。



 类似资料:
  • 问题内容: 我正在尝试创建一个非常简单的REST服务器。我只是有一个测试方法,它将返回字符串列表。这是代码: 它给出以下错误: 我希望JAXB对诸如String,Integer等简单类型具有默认设置。我想不是。这是我的想象: 使这种方法最简单的方法是什么? 问题答案: 我使用@LiorH的示例并将其扩展为: 注意,它使用泛型,因此您可以将其与String之外的其他类一起使用。现在,应用程序代码很简

  • 问题内容: 所以这是我的问题。给了我生成的XML文件应符合的XSD。使用maven插件和外部绑定文件,我生成了源代码。但是,当我尝试编组对象时,生成的XML不符合我的要求。 我的XSD包含以下内容: 生成的XML片段如下所示: 当我期望它是: 有没有一种方法可以彻底解决此问题? 我不想为每一个写几个适配器,组合。由于XSD可能会发生变化,因此我想保持生成的源代码不变。 问题答案: 您将需要使用此用

  • 问题内容: 我在代码中遇到问题。 当我在本地(http:// localhost:8080 / home / rest / parameter / )上运行应用程序时,出现以下错误。我的主要要求是在xml上的UI上显示所有信息。 org.jboss.resteasy.spi.UnhandledException:com.sun.xml.bind.v2.runtime.IllegalAnnotati

  • 有没有可能创建jaxb编组器,它可以自动将数字签名添加到xml内容中。 例如,如果我有一个定义为: 我的xml由marshaller生成,看起来像: 我希望它看起来像: 我希望有办法通过马歇尔做到这一点?如果没有,也许还有其他简单的方法来签署xml? 提前致谢

  • 问题内容: 我正在尝试与JAXB进行封送处理。 我的输出就像 但是我需要像这样的输出 我正在使用以下代码来执行此操作。如果我取消注释代码,则会出现属性绑定异常。没有它,我可以编译,但无法获得所需的确切输出。 和我的豆lo 转接器类别 问题答案: 您可以执行以下操作: 适配器CDATA 根 该注释用于指定的应该被使用。 演示版 我必须包装一个以获得所需的效果。另请注意,设置方法意味着它负责该操作的所

  • 问题内容: 我在使用Marshaller.JAXB_FRAGMENT属性成功编组时遇到了一些麻烦。这是我尝试输出的XML的简单版本。 的和元件基本上围住了大量的只是容器元素&元件。我目前正在尝试在马歇尔(Marshall)上编组。 是否有可能先将and 元素编组,然后再将其编组到element 上,然后将输出包含在标记中? 当我在WorkSet级别进行封送处理时,它将属性附加到WorkSet标记中