Как добавить пользовательское поведение в сгенерированные классы JAXB.Пользовательский не переопределяет существующие методы - PullRequest
1 голос
/ 18 декабря 2010

Я получил xsd от внешнего источника, который я не могу контролировать.Теперь мы хотим добавить пользовательские методы в сгенерированные классы JAXB, чтобы объект знал больше о себе, а не был простым POJO с геттерами и сеттерами.

Идея в том, что когда мы реализуем такой подход,не нужно детализировать гидратированный объект, но спросить у объекта конкретную информацию, которая нам нужна, путем вызова пользовательских методов и может получить то, что мы хотим?

Конечно, существует традиционный подход к программированию, в котором я хранюна детализацию потомков потомков потомков корневого объекта, вызов метода get для каждого потомка и реализацию бизнес-логики.Но почему-то команда здесь не хочет этого.

Один из подходов, который я использовал до сих пор, - это грубая сила один.Как я генерирую классы из XSD, используя JAXB.тогда у меня есть внешняя утилита (сейчас это отдельная Java-программа), которая при запуске будет читать некоторые текстовые файлы (структурированные по-своему, чтобы выяснить, какой метод и в какой файл .java должен идти) в определенном каталогекоторый содержит пользовательские методы и перемещает эти методы в соответствующие классы, сгенерированные JAXB.Каждый раз, когда я получаю новую версию XSD, мне нужно сгенерировать классы, вызвать эту утилиту и, возможно, решить некоторые проблемы компиляции и т. Д. На случай, если в сгенерированных JAXB классах появятся переменные.Утилита работает отлично.Но я хочу знать это.

Есть ли лучший способ сделать это?Я проверил интернет.Есть несколько решений, но они просто переопределяют существующие методы get в сгенерированных объектах JAXB и не добавляют совершенно новые методы.

Пожалуйста, предложите.

1 Ответ

1 голос
/ 18 декабря 2010

Что ж, «самым чистым подходом» будет использование Аспектно-ориентированного программирования (AOP), которое выполняет то, что вы описываете не на уровне исходного кода, а во время выполнения. Он внедряет методы в классы. Одной из возможных реализаций АОП является AspectJ

Вторая альтернатива, которая была бы возможна, если бы XML-форма не была слишком сложной, - это создание оболочки вокруг нее.

Третий вариант, который вы уже описали. Но я полагаю, что вы можете положиться на стандартные инструменты вместо того, чтобы что-то кодировать самостоятельно - я бы предложил использовать для этого стандартные инструменты diff / patch. Пока ваш стиль кода исправлен, не сложно создать diff из существующего измененного файла Java и применить его к только что сгенерированному коду JAXB.

...