当前位置: 首页 > 知识库问答 >
问题:

将Guava的Optional与@XmlAttribute一起使用

缑文栋
2023-03-14

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

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

“refId”字段是可选的,所以我想使用Guava的可选构造来引用内存中的字符串。我看到了使用Guava的Optional包装的泛型@XmlJavaTypeAdapter来解组,这提供了一个完整的示例,如果您使用的是元素(即使这不是最初的问题),那么您将如何设置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设置为子元素而不是属性。

提前感谢!

共有1个答案

龚鸿雪
2023-03-14

Xml属性只能有简单的类型(如字符串、整数等),因此不能使用OptionalAdapter

   public final class StringOptionalAdapter extends OptionalAdapter<String>
   {
   }  

页Java语言

   @XmlAttribute
   @XmlJavaTypeAdapter(StringOptionalAdapter.class)
   private Optional<String> refId;
 类似资料:
  • 问题内容: 新的Java 8流框架和新朋友创建了一些非常简洁的Java代码,但是我遇到了一个看似简单的情况,很难做到简洁。 考虑一个和方法。我想将映射到Optional s并获得第一个Other。显而易见的解决方案是使用 ,但是 要求你返回一个流,并且 没有 方法(或者它是 或提供一种将其转换为或将其视为的方法 )。 我能想到的最好的方法是: 但这对于一个很常见的案例来说似乎太漫长了。有人有更好的

  • 主要内容:1 什么是Guava Optional类,2 Guava Optional类的语法,3 Guava Optional类的方法,5 Guava Optional类的例子1 什么是Guava Optional类 Optional 是一个不可变对象,用于包含非空对象。可选对象用于表示没有值的空值。此类具有各种实用程序方法,以方便代码处理可用或不可用的值,而不是检查空值。 2 Guava Optional类的语法 3 Guava Optional类的方法 方法 描述 static <T> Op

  • 问题内容: 因此,我一直在为这个(应该是)简单的练习而绞尽脑汁,以使该程序将日期字符串转换为对象,对其进行格式化,并在完成后将其作为字符串再次返回。 这是程序的最后一点,它从文件中获取一小段文本,将其分解为单独的记录,然后将记录分解为单独的数据并将它们分配给个人对象。 我已经在多个位置检查了该代码,并且该代码完全执行了应该执行的操作,直到调用了format函数(该函数抛出)为止。为对象分配了应该分

  • 问题内容: 我想在目录中获取具有特定扩展名的文件列表。在中,我看到了可以做到这一点的方法。 由于我需要特定的扩展名,因此我创建了一个。但是,当我与此一起使用时,出现编译错误。我以为自以来,我应该能够做到这一点。代码如下: 最后一行显示编译错误: 类型的方法不适用于类型的参数 我正在尝试使用,不是。为何编译器无法识别这一点? 如果我编写自己的扩展筛选器,则此方法有效。我宁愿使用而不愿自己写。我究竟做

  • 问题内容: 我正在尝试在我的watchKit应用中使用firebase数据库。我已经在我的iPhone应用程序上开发了此功能,但是发现在我的Watch应用程序上很难做到这一点。当我尝试将firebase导入watch应用程序的VC类中时,它正在创建error 。 可以在Watch app中使用Firebase吗? 问题答案: 可悲的是,没有支持,并由于这样的事实,有没有支持在这些版本中,并高度依赖

  • 问题内容: 当请求来自Ajax.ActionLink(使用Http方法发布)时,是否可以在控制器操作上使用ValidateAntiForgeryToken属性。替代方法似乎是手动滚动JQuery Ajax请求,但我很好奇MVC Ajax框架中是否有办法。 问题答案: 我还没看过。您必须将令牌放入POST中记录的数据中。每次都使用相同的防伪令牌ID(或名称,我不记得了),但是您必须非常小心,并确保您