IllegalAnnotationsException SetMultimap是一个接口,JAXB无法处理接口

时间:2010-08-13 11:30:30

标签: java jaxb guava

我有以下代码:

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满意?

2 个答案:

答案 0 :(得分: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。如果您不使用哈希多图,那么@XmlElement只有TreeMultimap.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());
  }
});

答案 1 :(得分:1)

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

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

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