Проблема с созданием клиента веб-служб Java SOAP с помощью инструмента JDK wsimport из WSDL, сгенерированного приложением .NET 2.0
Я пытаюсь создать клиент для некоторых веб-сервисов SOAP с помощью инструмента JDK 6 wsimport
.
WSDL был создан приложением .NET 2.0. Для приложений .NET 3.X он отлично работает.
Когда я запустил
wsimport -keep -p mypackage http://myservice?wsdl
он показывает несколько сообщений об ошибках, подобных этому:
[ERROR] Класс/интерфейс с тем же именем "mypackage.SomeClass" уже используется. Используйте настройку класса для разрешения этого конфликта. линия?? http://myservice?wsdl
Когда я создаю клиент веб-служб с помощью Axis 1.4 (с помощью подключаемого модуля Eclipse WebTools).
Кто-нибудь знает, что я могу сделать, чтобы использовать инструмент wsimport
? Я действительно не понимаю, что такое "настройка класса".
Ответы
Ответ 1
Я не знаю, было ли это когда-либо решено, но я потратил некоторое время на поиски решения этой проблемы.
Я нашел исправление здесь - https://jax-ws.dev.java.net/issues/show_bug.cgi?id=228
Решение состоит в том, чтобы запустить wsimport с помощью -B-XautoNameResolution
(без пробелов)
Ответ 2
Для тех, кто читает это с помощью maven, это как добавить его в файл .pom. Обратите внимание на аргументы в разделе конфигурации. Это не очень легко найти в документации. Большое спасибо Исааку Стивенсу за его помощь в этом.
<!-- definition for ERPStandardWork service -->
<execution>
<id>ERPStandardWorkService</id>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<!-- this resolves naming conflicts within the wsdl - there are several copies of fault report objects which clash otherwise. -->
<args>
<arg>-B-XautoNameResolution</arg>
</args>
<wsdlDirectory>${basedir}/src/main/resources/META-INF/wsdl</wsdlDirectory>
<wsdlFiles>
<wsdlFile>ERPStandardWork.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>${basedir}/src/main/resources/META-INF/wsdl/ERPStandardWork.wsdl
</wsdlLocation>
<staleFile>${project.build.directory}/jaxws/ERPStandardWork/.staleFlag
</staleFile>
</configuration>
</execution>
Ответ 3
Возможно, вы создадите все классы из файла WSDL в том же пакете. Если это так, попробуйте указать другой целевой пакет для каждого файла WSDL с опцией -p wsimport.
Ответ 4
Принятый ответ выше поможет решить вашу проблему, но не исправит основную причину.
Проблема возникает из-за того, что операция в вашем файле wsdl имеет то же имя, что и xsd: complexType в вашем xsd файле - например, пример ниже. Все типы и операции должны иметь уникальные имена.
<xsd:complexType name="SearchDocuments">
<xsd:sequence>
<xsd:element name="document" type="ns0:SearchDocumentById" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<operation name="SearchDocuments">
<input wsam:Action="http://controller.xxx.xxx.com/DocumentWS/searchDocumentsRequest" message="tns:searchDocumentsRequest"/>
<output wsam:Action="http://controller.xxx.xxx.com/DocumentWS/searchDocumentsResponse" message="tns:searchDocumentsResponse"/>
</operation>
Итак, проверьте свои операции и типы. Убедитесь, что ни одно из них не имеет одинакового имени, то есть нет повторяющихся имен.