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

我有以下代码:

private SetMultimap dynamicFields = TreeMultimap.create(Ordering.natural(), new Comparator() { @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 test = new ArrayList(); 

我如何修复SetMultimap以便JAXB满意?

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

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

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

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

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

使用上面的代码,如果您愿意,还可以使用MultiHashMap实例替换该字段。 您需要为每种可能的运行时类型添加@XmlElement 。 如果你不会使用哈希多图,那么一个带有TreeMultimap.class @XmlElement就足够了:

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