IllegalAnnotationsException SetMultimap является интерфейсом, и JAXB не может обрабатывать интерфейсы - PullRequest
1 голос
/ 13 августа 2010

У меня есть следующий код:

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 ]

1 голос
/ 16 августа 2010

Разница между List / ArrayList и SetMultimap заключается в том, что один является коллекцией Java, а другой - структурой данных вне обычной иерархии коллекции Java.Это означает, что JAXB считает его нормальным классом.

Спецификация JAXB не поддерживает интерфейсы.Вероятно, вы используете реализацию Metro JAXB, которая также не поддерживает интерфейсы.Некоторые реализации JAXB, такие как MOXy , могут поддерживать интерфейсы, но некоторые реализации JAX-WS зависят от конкретного значения JAXB, и замена реализаций JAXB не всегда возможна:

Лучше всего использовать аннотацию на уровне параметра для преобразования SetMultimap в класс, который может обрабатываться JAXB:

1 голос
/ 13 августа 2010

Вам необходимо добавить аннотации, чтобы сообщить 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());
  }
});
...