2015-03-24 7 views
2

Я генерирую пользовательский Java-код из WSDL, предоставленного PeopleSoft. Я написал несколько плагинов XJC, чтобы попытаться очистить сгенерированный код, который будет проще в использовании - добавление интерфейсов и пользовательских методов и т. Д.Не удается найти классы исключений в CodeModel в плагине XJC

Однако я хотел бы добавить общий интерфейс к генерируемым классам исключений, но внутри моего плагина, классы, похоже, не существуют.

Сгенерированный класс Exception выглядит следующим образом:

public class M286565V1 extends Exception 

Все они имеют один и тот же шаблон именования (M, за которым следует строка цифр, заканчивающийся в V1), и все они проходят java.lang.Exception. Однако все они также имеют общий метод, getFaultInfo(), который я хочу добавить в интерфейс.

В моем плагине я просматриваю все классы, предоставляемые Outline.getClasses(), и проверяю их, если они расширяют java.lang.Exception.

for (ClassOutline classOutline : outline.getClasses()) { 
    final JDefinedClass implClass = classOutline.implClass; 

    JClass superClass = implClass._extends(); 
    if (superClass != null && superClass.fullName().equals("java.lang.Exception")) { 
     //This class is an Exception class 
    } 
} 

Это не позволяет найти классы исключений.

Я также попытался согласование по имени:

for (ClassOutline classOutline : outline.getClasses()) { 
    final JDefinedClass implClass = classOutline.implClass; 

    //Try to capture exception classes by name 
    //Exception classes start with an M, followed by a number 
    final String className = implClass.name(); 
    LOG.debug("Checking class {}", className); 
    if (className.startsWith("M") && Character.isDigit(className.charAt(1))) { 
     //This class is an Exception class 
    } 
} 

Это терпит неудачу, а также, и сообщение регистрации («Проверка класса ...») не печатает любого из классов исключений, которые в конечном счете генерируется.

Я также попытался переместить этот код из метода run() и в метод postProcessModel() моего плагина, надеясь, что код, выполняемый позже в этом процессе, поможет. Это тоже не удалось.

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

Есть ли способ захватить эти классы из плагина XJC во время выполнения?

Заранее благодарим за любую помощь, которую вы можете предоставить.

+0

Возможно, вам это поможет: http://stackoverflow.com/questions/9247730/what-is-the-role-of-classoutline-jclass-cclass-in-codemodel/9404341 – lexicore

ответ

1

Рассмотрите возможность использования JAXB2 BasicsInheritance plugin. (Отказ от ответственности: я автор.)

Вы должны действительно получать классы в методе run вашего плагина. postProcessModell - неправильное место, слишком рано, он вызывается после загрузки модели для постпроцесса.

Я бы просто рекомендовал его отладить. Вы можете выполнить XJC из теста без больших проблем, увидеть этот тест, например:

https://github.com/highsource/jsonix-schema-compiler/blob/master/compiler/src/test/java/org/hisrc/jsonix/xjc/plugin/tests/JsonixPluginTest.java

Надеется, что это помогает.

+0

Я динамически генерирую интерфейс класс, он не является статичным. Поскольку наши WSDL меняются все время (хотя они не должны), все настройки, которые я добавляю, являются динамическими.Я создаю много интерфейсов и пользовательских классов таким образом. Он работает для всех, кроме классов java.lang.Exception. – Akido