我有以下代码:
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满意?
答案 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处理的类: