1

我有以下代码:

private SetMultimap<String, Dynamic> dynamicFields = TreeMultimap.create(Ordering.natural(), new Comparator<Dynamic>() {
  @Override
  public int compare(Dynamic o1, Dynamic o2) {
   return o1.getTitle().compareTo(o2.getTitle());
  }
 });

这给了我以下例外。

IllegalAnnotationsException SetMultimap is an interface, and JAXB can't handle interfaces

我的问题是,为什么这不起作用,但这样做:

List<Dynamic> test = new ArrayList<Dynamic>();

以及如何修复 SetMultimap 以使 JAXB 满意?

4

2 回答 2

1

您需要添加注释来告诉 JAXB 引用的可能运行时类型,如下所示:

@XmlElements({
@XmlElement(type = TreeMultimap.class, name = "treeMultimap"),
@XmlElement(type = MultiHashMap.class, name = "hashMultimap")
})
private SetMultimap<String, Dynamic> dynamicFields = TreeMultimap.create(Ordering.natural(), new Comparator<Dynamic>() {
  @Override
  public int compare(Dynamic o1, Dynamic o2) {
    return o1.getTitle().compareTo(o2.getTitle());
  }
});

使用上面的代码,您还可以根据需要将字段替换为 MultiHashMap 的实例。您需要@XmlElement为每种可能的运行时类型添加一个。如果您永远不会使用哈希多重映射,那么一个@XmlElementTreeMultimap.class足够了:

@XmlElement(type = TreeMultimap.class, name = "treeMultimap")
private SetMultimap<String, Dynamic> dynamicFields = TreeMultimap.create(Ordering.natural(), new Comparator<Dynamic>() {
  @Override
  public int compare(Dynamic o1, Dynamic o2) {
    return o1.getTitle().compareTo(o2.getTitle());
  }
});
于 2010-08-13T12:38:37.093 回答
1

List/ArrayList 和 SetMultimap 的区别在于,一个是 Java 集合,另一个是正常 Java 集合层次结构之外的数据结构。这意味着 JAXB 认为它是一个普通类。

JAXB 规范不支持接口。您可能正在使用也不支持接口的 Metro JAXB 实现。一些 JAXB 实现(例如MOXy)可以支持接口,但一些 JAX-WS 实现依赖于特定的 JAXB 实现,并且并不总是可以替换 JAXB 实现:

最好的办法是使用参数级别注释将 SetMultimap 转换为可由 JAXB 处理的类:

于 2010-08-16T19:41:44.207 回答