使用Guava的Optional与@XmlAttribute

我想设置一个带JAXB注释的Java类,以下列格式生成一些XML:

 The title of my page  

“refId”字段是可选的,所以我想使用Guava的Optional构造来引用内存中的字符串。 我看到使用generics@XmlJavaTypeAdapter解压缩包装在Guava的Optional中 ,如果您使用的是元素(即使这不是原始问题),它会提供一个完整的示例,但是您如何设置XML属性的注释?

这是我到目前为止所拥有的:

 @XmlRootElement(name="page") public final class Page { @XmlAttribute @XmlJavaTypeAdapter(OptionalAdapter.class) private Optional refId; @XmlElement private String title; ... getters/setters, default constructor, etc. } 

而OptionalAdapter是一个简单的XmlAdapter:

 public class OptionalAdapter extends XmlAdapter<T, Optional> { @Override public Optional unmarshal(T v) throws Exception { return Optional.fromNullable(v); } @Override public T marshal(Optional v) throws Exception { if (v == null || !v.isPresent()) { return null; } else { return v.get(); } } } 

当我尝试针对上面的代码加载unit testing时,它在初始化期间立即失败,但是如果我将注释更改为@XmlElement,测试将运行并通过,但显然将refId设置为子元素而不是属性。

提前致谢!

Xml属性只能有简单类型(如StringInteger等),因此不能使用OptionalAdapter
如果您的字段具有String类型,则适配器应具有OptionalAdapter类型。
你可以用下一个方式做:
– 创建其他类,并使用XmlAdapter

  public final class StringOptionalAdapter extends OptionalAdapter { } 

Page.java

  @XmlAttribute @XmlJavaTypeAdapter(StringOptionalAdapter.class) private Optional refId;