代码之家  ›  专栏  ›  技术社区  ›  Shervin Asgari

illegalannotationsException setmultimap是接口,JAXB无法处理接口

  •  1
  • Shervin Asgari  · 技术社区  · 14 年前

    我有以下代码:

    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 回复  |  直到 14 年前
        1
  •  1
  •   bdoughan    14 年前

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

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

    您最好使用参数级注释将setmultimap转换为JAXB可以处理的类:

        2
  •  1
  •   Alexander Torstling    14 年前

    您需要添加注释来告诉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());
      }
    });
    

    使用上面的代码,如果您愿意,也可以用多哈希映射的实例替换字段。您需要添加 @XmlElement 对于每个可能的运行时类型。如果你不使用哈希多重映射,一个 @ XML-元素 具有 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());
      }
    });