Расширение модуля генерации кода оси - PullRequest
4 голосов
/ 12 ноября 2010

Короче говоря, я хочу добиться возможности запуска wsdl2java и генерирования дополнительного кода.Кто-нибудь делал это и может предлагать советы / подсказки / советы, кто-нибудь делал что-то похожее с другим подходом, который изложен ниже в вопросе (намного дальше вниз)?

В полной форме:

Справочная информация:

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

Текущее состояние:

Я написал простой генератор кода первого поколения, которыйобрабатывает создание 95% кода, однако это читает в рукописной конфигурации xml, выводит код с помощью FileWriter (eugh), но мне все еще нужно написать код вручную, чтобы связать его, передать информацию в / из реального клиента веб-сервисакод.Это было просто быстрое и грязное решение, так как я нуждалось в этом быстро, а также действовать как POC.

Подход к решению этого вопроса: Я подбираю это в свое время чистопотому что я думаю, что это интересная проблема, но как таковая, я не хочу тратить много ее на тупиковый подход.

Я считаю, что путь к достижению моей цели - написать расширение для модуля генерации кода.как описано здесь http://wso2.org/library/35, Я верю, написав это расширение, я получу доступ к модели оси wsdl и могу применить к ней свой собственный xslt.

Если вы согласны и сделали подобное,Есть какие-то советы, которыми вы хотите поделиться, или полезные ресурсы, на которые вы можете указать мне.

Если вы не согласны с моим подходом, я буду признателен за краткое описание (не хочу тратить ваше время), почему и предложениеза новый подход.

Ответы [ 4 ]

0 голосов
/ 05 марта 2011

Дальнейшие исследования показали, что нужно было создать новый CodeEmitter на основе AxisServiceBasedMultiLanguageEmitter.

К сожалению, этот проект был закрыт, так как больше не требовалось создавать клиенты веб-служб.Стороннее программное обеспечение выпустило новую версию, позволяющую напрямую использовать веб-сервисы.

0 голосов
/ 16 декабря 2010

Вы уже начали писать генератор кода, чтобы достичь своей цели, поэтому вы можете попробовать продолжить этот путь.Библиотека codemodel - довольно удивительная библиотека для генерации кода.Я только недавно использовал его для генерации кода, и это было очень хорошо.

Я бы посоветовал вам дать этой библиотеке кодовых моделей попробовать сгенерировать необходимый вам код.Это библиотека кодовых моделей, написанная для jaxb wsdl для компилятора java.

0 голосов
/ 16 декабря 2010

Мы много использовали wsdl2java (но по оси 1.4). Мои единственные советы:

1 использует сложные / структурированные типы в качестве аргументов для операций, например. resetWidget (widgetStruct), где класс widgetStruct содержит поля widgetId, widgetName, widgetType и т. д. вместо resetWidget (arg1, arg2, arg3 ..). Так что в следующем году, когда вы расширите WSDL и добавите еще несколько параметров, весь унаследованный код все равно будет скомпилирован без необходимости расширять все ваши методы. Этот подход был фактически навязан нам, потому что другой (старый) инструмент WSDL не генерировал ответы правильно, если мы передали все поля как параметры.

2 Поместите всю свою бизнес-логику в другие классы. Поэтому, когда вы восстанавливаете скелет, вы можете просто вставить несколько строк кода вместо того, чтобы обновлять огромные куски кода.

Возможно, некоторые из этих проблем решены в Axis2.

0 голосов
/ 13 декабря 2010

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

  • Groovy

Groovy отлично подходит для быстрого создания прототипов и шаблонов. Например, вы можете собирать информацию из базы данных или Wsdl и генерировать код на основе шаблона. Здесь вы можете увидеть несколько примеров: http://groovy.codehaus.org/Groovy+Templates

  • PMD API

PMD - это инструмент для сканирования кода Java и сообщения о потенциальных проблемах. Он также предоставляет API для анализа кода с использованием XPATH и имеет очень богатую модель для работы. Вы можете делать такие вещи, как:

final Java15Parser parser = new Java15Parser();
final FileInputStream stream = new FileInputStream("VehicleServiceType.java");

final Object c = parser.parse(new InputStreamReader(stream));

final XPath xpath = new BaseXPath("//TypeDeclaration/Annotation/NormalAnnotation[Name/@Image = 'WebService']",
        new DocumentNavigator());

for (final Iterator iter = xpath.selectNodes(c).iterator(); iter.hasNext();) {
   final Object obj = iter.next();
      // Do code generation based on annotations...
}

Лично я обнаружил, что смешанный подход работает лучше, чем монолитный. Генерация кода часто является искусством, а не наукой. Еще одна вещь: в моем текущем проекте я смотрю на Python для (простой) генерации кода. У него очень хорошая библиотека шаблонов ( jinja ), но я бы не рекомендовал ее для разбора кода Java.

Надеюсь, это поможет!

...