Может ли веб-служба, сгенерированная с помощью `java2wsdl`, включать API из более чем одного класса Java?

Я использую Axis2 для запуска веб-службы. Вот services.xml файл, который определяет сервис:

<service name="XEWS" scope="transportsession" class="com.mc.xews.XEWS">
<messageReceivers>
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
    <messageReceiver  mep="http://www.w3.org/2004/08/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass" locked="false">com.mc.xews.XEWS</parameter>

Моя проблема в том, что весь API находится в одном файле Java XEWS.java и этот класс отправляется java2wsdl, Есть ли способ иметь более одного класса в качестве входных данных для java2wsdl? Этот файл используется с WSDL создать веб-сервис. Сейчас я использую только один класс для ввода java2wsdl, так что этот класс стал огромным, поскольку есть много API-функций.... которые можно было бы сгруппировать в отдельные классы, если бы я знал, как отправить более одного файла в java2wsdl. Документация JavaDocs, сгенерированная из этого класса, также трудна для чтения.

Может ли веб-сервис включать API из нескольких классов Java?

Может быть extra classes параметр параметра из java2wsdl должен быть использован для этого?

2 ответа

Решение

Нет, это невозможно, поскольку инструмент генерации Axis2 отображает класс Java: WSDL как 1:1 в подходе, основанном на коде. Гипотетически, они могли бы предоставить функцию для сопоставления нескольких классов Java с одним WSDL (что потребовало бы дополнительных параметров в инструменте генерации).

Axis2 использует "дополнительные классы" для дополнительных типов - подклассы исходных сложных типов, используемых в качестве ввода / вывода.

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

В WSDL самое большое пространство имен - это сама служба (ее методы самые маленькие). WSDL не поддерживает вложенные пространства имен. Наиболее логичным сопоставлением между Java и WSDL является класс Java к службе WSDL. Это то, что делает ваш запрос на передачу нескольких Java-классов невозможным для получения одного WSDL. Вы всегда можете разместить более одного WSDL, но вам все равно придется генерировать их отдельно.

Цитирую w3c:

Related concrete endpoints are combined into abstract endpoints (services)

Существует механизм IMPORT для объединения WSDL, но это рассматривается как один сервис для WSDL2Java (или любого другого клиента SOAP), поэтому он все равно будет представлять один сервис.

Если вас беспокоит размер реализации, просто посмотрите на веб-сервис PayPal.

Другие вопросы по тегам