在@XmlAttribute中使用Guava的Optional

时间:2014-04-14 22:21:57

标签: java xml jaxb guava

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

<page refId="0001">
    <title>The title of my page</title>
</page>

&#34; refId&#34; field是可选的,所以我想使用Guava的Optional构造来引用内存中的字符串。我看到Using generic @XmlJavaTypeAdapter to unmarshal wrapped in Guava's Optional,如果您正在使用某个元素(即使这不是原始问题),它会提供一个详尽的示例,但您如何设置XML属性的注释?< / p>

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

@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设置为子元素一个属性。

提前致谢!

1 个答案:

答案 0 :(得分:6)

Xml-attribute只能包含简单类型(如StringInteger等),因此您无法使用OptionalAdapter<T>
如果您的字段的类型为String,那么适配器的类型应为OptionalAdapter<String> 你可以用下一个方式做:    - 创建其他类,使用为XmlAdapter

   public final class StringOptionalAdapter extends OptionalAdapter<String>
   {
   }  

<强> Page.java

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