【问题标题】:Marshalling/Unmarshalling nulls in JAXB在 JAXB 中编组/解组空值
【发布时间】:2011-11-08 15:24:20
【问题描述】:

我在一个使用 JAXB 从 XML (JAX-RS) 编组/解组的 REST 服务器中有几个手写的 Java 类。

我已经实现了一个从 Scala 借来的小类层次结构:Option<T>Some<T>None<T>,并希望在我的模型中使用这些来区分 XML 中的缺失值和 null 值。

例如,在以下 XML 中,缺少值 phone_number,应将对应的 Java 模型字段设置为 None

<person>
  <last_name>Jones</last_name>
  <first_name>Abe</first_name>
</person>

class Person {
  @XmlElement("last_name")
  Option<String> lastName;

  @XmlElement("first_name")
  Option<String> firstName;

  @XmlElement("phone_number")
  Option<String> phoneNumber;
}

而在此 XML 消息中,phone_number 应设置为 new Some(null)

<person>
  <last_name>Jones</last_name>
  <first_name>Abe</first_name>
  <phone_number></phone_number>
</person>

我意识到使用这种方案,我无法区分长度为零的字符串和空字符串。

我曾想过使用@XmlJavaTypeAdapter,但我有很多模型类,我宁愿使用适用于所有类的“集中式”解决方案。

我相信正确的解决方案是使用MessageBodyWriterMessageBodyReader,但我仍然希望内置机制来处理每个类;我将处理各个字段(包括字符串和日期)。

【问题讨论】:

  • 嗯,Option 类的 XMlAdapter 和注释上的 nillable = true 就够了吗?
  • @forty-two:基本上是的,但是 JAXB 更喜欢将 xsi:nil 用于 null 元素,而不是从文档中省略它们。我不确定如何说服 JAXB 完全排除某个元素...
  • 请注意,空集合与完全没有集合会出现类似的问题:stackoverflow.com/questions/2250504/…
  • @forty-2:使用XmlAdapter 的问题是我相信你必须用@XmlJavaTypeAdapter 注释每个字段。我的服务器模型中有数百个字段。

标签: java null jaxb


【解决方案1】:

您始终可以将Person 类属性设置为默认值。 如果您默认PhoneNumber 为“无”,将其保存为 XML 将为您提供以下标记

 <phone_number>None</phone_number>

在任何情况下,PhoneNumber 属性都将保持为“None”,直到您调用 setter 来设置电话号码的实际值。

希望对你有帮助,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多