【问题标题】:Using Guava's Optional with @XmlAttribute将 Guava 的 Optional 与 @XmlAttribute 一起使用
【发布时间】: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 设置为子元素属性。

提前致谢!

【问题讨论】:

    标签: java xml jaxb guava


    【解决方案1】:

    Xml-attribute 只能有简单类型(如StringInteger 等),所以不能使用OptionalAdapter&lt;T&gt;
    如果您的字段具有 String 类型,则适配器应具有 OptionalAdapter&lt;String&gt; 类型。
    您可以通过以下方式进行操作:
    - 创建附加类,使用为XmlAdapter

       public final class StringOptionalAdapter extends OptionalAdapter<String>
       {
       }  
    

    Page.java

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

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2016-06-02
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      相关资源
      最近更新 更多