Как сделать так, чтобы сгенерированные JAXB классы участвовали в шаблоне Visitor? - PullRequest
2 голосов
/ 11 февраля 2011

Привет, ребята, надеюсь, здесь все просто.

Я генерирую классы с помощью JAXB из схемы, и я хотел бы иметь возможность обрабатывать их с помощью шаблона Visitor.

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

Класс по умолчанию:

public class MyClass {
   private String name;

   public void get/setName() {...}
}

Желаемый класс:

public class MyClass implements MyVisitorNode {
  private String name;

  public void get/setName() {...}

  public void accept(MyVisitorVisitor visitor) {
    visitor.visit(this);
  }
}

Возможно ли это, и если да, каковы варианты? (Изменить схему, манипулирование байт-кодом во время выполнения, как-то манипулировать JAXBContext ...)

В идеале, не полагаясь на специфичные для поставщика расширения.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

Компилятор xjc для JAXB имеет интерфейс плагина, который позволяет разработчикам создавать плагины, которые модифицируют сгенерированный код. Мой личный фаворит - это fluent-api, но есть и другие, которые можно добавить в String, равно, hashCode и т. Д.

Я создал плагин, использующий эту технологию для реализации шаблона посетителя, и сделал его доступным в качестве проекта кода Google. Это может быть не совсем то, что вы ищете, но это может быть хорошим местом для начала просмотра кода и тестирования, если вам нужно изменить его в соответствии с вашими потребностями.

http://code.google.com/p/jaxb-visitor/

2 голосов
/ 11 февраля 2011

Сгенерированные JAX-B классы являются стандартными классами Java, которые вы можете настраивать любым способом, каким пожелаете, например, расширять интерфейс, добавлять дополнительные методы и т. Д.). Аннотации к классу и атрибутам являются движущим фактором процесса маршаллинга и демаршаллинга.

С учетом вышесказанного есть некоторые вещи, которые необходимо учитывать, если вы настраиваете классы, сгенерированные JAXB. Как указано в начале каждого класса « Любые изменения в этом файле будут потеряны при перекомпиляции исходной схемы ». Короче говоря, если вы настраиваете класс, вам нужно будет вручную внести изменения в код для поддержки любых обновлений схемы. Если вы восстановите классы, ваш пользовательский код будет удален, и вам придется начинать все сначала.

...