WSDL для Java или Java для WSDL? - PullRequest
       15

WSDL для Java или Java для WSDL?

8 голосов
/ 16 марта 2011

Я недавно выбрал проект, который имеет довольно неприятный процесс сборки.Схемы XSD с ручным кодированием считываются JAXB для создания модели классов и фабрик Java, которая используется в классах веб-сервисов Java с ручным кодированием (аннотированные), которые затем развертываются на сервере, который используется в качестве источника для чтения полногоWSDL для создания второй модели на основе Java, которая включает классы обслуживания и фабрики для полного WSDL, который используется в клиентских программах.

Это звучит ужасно, и я не думаю, что мне нужнонастолько сложный, что на каком-то этапе я бы хотел все это убрать и либо

  • Изготовить вручную WSDL, сгенерировать полную модель и добавить сервисный код.
  • Или - Напишите классы службы и модели и сгенерируйте WSDL по мере необходимости на сервере во время выполнения.

В любом случае я хочу получить одну исходную базу для модели, которая является как сервером, так и сервером.клиенты могут использовать и иметь один «источник правды» для того, какой должна быть модель, тогда как на данный момент я чувствую, что у меня их несколько.

На данный момент я склоняюсь ко второму варианту, но какой бы вы выбрали?А какие технологии вы бы использовали?

Ответы [ 7 ]

8 голосов
/ 16 марта 2011

В проекте, над которым я работаю, в настоящее время мы полностью переделываем наши веб-сервисы. Эти сервисы предлагают функциональность сервера клиентам через SOAP. Из того, что я узнал, рассматривая все тонкости этого протокола, которые сильно влияют на компоновку WSDL, я бы не стал сам писать WSDL. Есть так много вещей, которые вы можете ошибиться (особенно, когда речь идет о таких вещах, как стиль параметров и все такое). И как только ваш WSDL «выйдет» и клиенты, сгенерированные из этого WSDL, будут счастливо обмениваться данными с вашим приложением, вы больше не сможете изменять его снова (или вы начнете думать о стратегии управления версиями, которая может оказаться довольно болезненной).

Поэтому я настоятельно рекомендую написать код службы на Java и позволить вашей библиотеке сгенерировать WSDL для вас. Затем вы можете очень легко поиграть с различными стилями связывания (которые, в свою очередь, влияют на совместимость с другими клиентами). Очень полную статью, описывающую все это, можно найти здесь:

http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/

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

Надеюсь, это поможет вам принять решение.

5 голосов
/ 16 марта 2011

Самый чистый метод - сгенерировать WSDL вручную или с помощью конструктора, а из них сгенерировать прокси и заглушки.

Логика, лежащая в основе этого способа, заключается в том, что WSDL определяет контракт на обслуживание, который должен быть независимым от реализации - а классы Java зависят от реализации - и эти подробности реализации часто передаются в WSDL

Точные проблемы зависят от используемого вами преобразователя Java в WSDL (или, что более важно, от преобразователя Java в XSD), но они довольно распространены, особенно если вы планируете добавлять в свою среду не Java-серверы или клиенты.

Если вы предпочитаете писать сервисы на Java, вы должны следовать некоторым рекомендациям, которые минимизируют блокировку реализации, например:

  • контролировать перевод из классов в XSD (я думаю, что это можно сделать с помощью аннотаций
  • использовать только простые типы и агрегаты простых типов в качестве параметров (не передавайте ваши обычные классы в качестве параметров)
4 голосов
/ 16 марта 2011

Я бы подумал, что извлечение wsdls и схем должно быть выполнимо с помощью простого процесса HTTP GET либо вручную, либо с помощью простого вызова кода (задача муравья и т. Д.), А не с довольно запутанным процессом, который вы описали.Сказав, что я обычно имею дело с веб-сервисами, которые имеют цикл выпуска, и поэтому мне обычно дают wsdls и схемы вручную.

Если вам придется повторно получать wsdls и схемы при каждой сборке, я бы склонен поместить процесс get в сборку в качестве предварительного шага (в maven это будет initialize фаза, и я хотел бы взглянуть на использование задачи GET ant ) с последующим шагом wsdl2java (в maven я обычно подключаю задачу ant wsdl2java к фазе generate-sources ).

2 голосов
/ 18 марта 2011

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

Учитывая эту преамбулу, причина, по которой XSD написаны от руки, состоит в том, чтобы избежать загрязнения параметров метода типами Java . Эта проблема загрязнения существует с самого начала.

Проблема двоякая: определение типа, ограничение языка. Типы, сгенерированные веб-службами типа JAX-RPC, не подходят для использования многими пользователями, не являющимися Java. Группа Java постоянно работает над этим, и я чувствую, что одна из двух проблем в значительной степени была обойдена с помощью JAX-WS. Попытка определения веб-сервисов вне контекста языка программирования (XML является языком) является причиной для написания рукописных определений данных.

Генерация WSDL, как отмечали многие, сложна, и ее лучше всего выполнять с помощью инструмента или IDE, которая генерирует WSDL - таким образом, транспортировка больше не является проблемой. Таким образом, XSD включаются в ваш WSDL, и, когда вы «закодируете» XSD, вы будете контролировать свой контент.

2 голосов
/ 16 марта 2011

Недавно я пошел по пути автоматической генерации классов Java из wsdl.Для этого я использовал wsdl2java.bat из проекта Apache cxf.http://cxf.apache.org/

Мне пришлось внести небольшие изменения (XmlElementWrapper) для коллекций и некоторые исправления пространства имен, но все остальное было в порядке.

1 голос
/ 28 декабря 2011

Мне очень нравится Spring-WS.Это контракт первый подход. Зачем сначала заключать контракт

Вы определяете свою XML-схему, и Spring создаст для вас WSDL.Это скрывает технические аспекты WSDL, это действительно чисто.

1 голос
/ 28 декабря 2011

Один из подходов заключается в использовании XML-схемы (XSD) для определения модели.Как только эта модель определена, вы определяете сервисные интерфейсы (WSDL), которые используют объекты из модели (XSD) в качестве входов / выходов сервисов.

Это определяет ваш абстрактный сервис и уровни модели.

Затем вы можете использовать ваши любимые инструменты и технологии для разработки конкретных реализаций.Вы даже можете использовать jAXB для определения Java-эквивалента библиотеки моделей XSD и использовать его в клиенте и на сервере.

http://buddhiraju.wordpress.com - блог по SOA, XML, интеграции и смежным темам

...