【发布时间】: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,但我有很多模型类,我宁愿使用适用于所有类的“集中式”解决方案。
我相信正确的解决方案是使用MessageBodyWriter 和MessageBodyReader,但我仍然希望内置机制来处理每个类;我将处理各个字段(包括字符串和日期)。
【问题讨论】:
-
嗯,Option 类的 XMlAdapter 和注释上的 nillable = true 就够了吗?
-
@forty-two:基本上是的,但是 JAXB 更喜欢将
xsi:nil用于 null 元素,而不是从文档中省略它们。我不确定如何说服 JAXB 完全排除某个元素... -
请注意,空集合与完全没有集合会出现类似的问题:stackoverflow.com/questions/2250504/…
-
@forty-2:使用
XmlAdapter的问题是我相信你必须用@XmlJavaTypeAdapter注释每个字段。我的服务器模型中有数百个字段。