【发布时间】:2014-04-14 22:21:57
【问题描述】:
我想设置一个带有 JAXB 注释的 Java 类来生成以下格式的 XML:
<page refId="0001">
<title>The title of my page</title>
</page>
“refId”字段是可选的,所以我想使用 Guava 的 Optional 构造来引用内存中的字符串。我看到Using generic @XmlJavaTypeAdapter to unmarshal wrapped in Guava's Optional,它给出了一个完整的示例,如果您使用的是一个元素(即使这不是最初的问题),但是您将如何设置 XML 属性的注释?
这是我目前所拥有的:
@XmlRootElement(name="page")
public final class Page {
@XmlAttribute
@XmlJavaTypeAdapter(OptionalAdapter.class)
private Optional<String> refId;
@XmlElement
private String title;
... getters/setters, default constructor, etc.
}
而 OptionalAdapter 是一个简单的 XmlAdapter:
public class OptionalAdapter<T> extends XmlAdapter<T, Optional<T>> {
@Override
public Optional<T> unmarshal(T v) throws Exception {
return Optional.fromNullable(v);
}
@Override
public T marshal(Optional<T> v) throws Exception {
if (v == null || !v.isPresent()) {
return null;
} else {
return v.get();
}
}
}
当我尝试针对上述代码加载单元测试时,它在初始化期间立即失败,但如果我将注释更改为 @XmlElement,测试将运行并通过,但显然将 refId 设置为子元素属性。
提前致谢!
【问题讨论】: