Настройки JAXB с плохо сформированным WSDL
Это сводит меня с ума. У меня есть схема, встроенная в WSDL, которая нуждается в настройке, потому что WSIMPORT выдает следующую ошибку
[ERROR] Complex type and its child element share the same name "DomainsMap".
Use a class customization to resolve this conflict.
line 878 of file:/C:/jaxws-ri/bin/ArtesiaWebServices.wsdl
1) У меня нет контроля над этим WSDL, так как я создаю первого клиента WSDL, и я ожидаю, что он пойдет по пересмотрам без какой-либо официальной консультации или выпуска для меня. 2) Это больше не допустимо, чтобы вручную исправить это столкновение имен, потому что мне нужно включить конструкцию заглушек в автоматизированную цепочку сборки.
Я должен использовать внешний файл настроек. Я просто не могу понять, как заставить работать настройку.
Вот оскорбительный фрагмент WSDL:
<wsdl:definitions>
<wsdl:types>
<xs:schema>
.
.
.
<xs:complexType final="extension restriction" name="domainsMap">
<xs:sequence>
<xs:element name="domainsMap">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="entry">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="key" type="xs:string"/>
<xs:element minOccurs="0" name="value" type="tns:domainValueMap"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
Это было бы отличным шансом для вас улучшить свои навыки JAXB. Любая помощь будет принята с благодарностью.
Я часами смотрел на документацию jaxb, но все равно не повезло. Я могу предложить весь WSDL, если это будет необходимо. Кто-нибудь может помочь?
2 ответа
Ну, сегодня утром я пришел на работу и смог понять это. Иногда лучше всего просто уйти от проблемы и вернуться со свежей головой. Вот решение, которое сработало для меня:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
wsdlLocation="ArtesiaWebServices.wsdl">
<enableWrapperStyle>true</enableWrapperStyle>
<enableAsyncMapping>false</enableAsyncMapping>
<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainsMap']/xs:sequence/xs:element[@name='domainsMap']/xs:complexType">
<!-- This binding will fix the domainsMap inner element called domainsMap. sheesh, who names stuff like that?! -->
<jaxb:class name="DomainsMapElement"/>
</jaxws:bindings>
<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainValueMap']/xs:sequence/xs:element[@name='domainValueMap']/xs:complexType">
<!-- This binding will fix the domainValueMap inner element called domainValueMap. sheesh, who names stuff like that?! -->
<jaxb:class name="DomainValueMapElement"/>
</jaxws:bindings>
</jaxws:bindings>
Я использую указанный выше файл внешней привязки с помощью инструмента wsimport в следующей команде.
Важные вещи об этом файле привязки:
- Используется пространство имен для привязок jaxws. Это единственный способ, которым я мог заставить выбор узла работать должным образом
Выбор узла должен заканчиваться на /xs:complexType. Если вы остановитесь на выборе имени элемента, компилятор выдаст ошибки.
wsimport -d сгенерированный -keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl
Используемые параметры:
-d генерируется указывает выходной каталог (в данном случае папка с именем "генерируется")
-b ArtesiaExternalBinding.xml указывает компилятору JAXB использовать файл привязки.
Держите заглушки (я просто использую заглушки для проверки)
наконец, я обнаружил, что это самая полезная информация: документы java.net о настройках jaxws
Это то, что привело меня к вложению настроек jaxb в теги jaxws. Спасибо за ссылку Петру Гардея
Непонятно, что вы пробовали или нет, но я бы сделал следующее: - используйте опцию -b в командной строке wsimport (документ доступен здесь). - информацию о связующих файлах можно найти здесь; - Подробное представление с примерами того, как настроить, чтобы избежать конфликтов имен здесь. Я привожу здесь выдержку - это должно исправить вашу проблему.
<jxb:schemaBindings>
<jxb:package name="primer.myPo">
<jxb:javadoc>
<![CDATA[<body> Package level documentation for generated package primer.myPo.</body>]]>
</jxb:javadoc>
</jxb:package>
<jxb:nameXmlTransform>
<jxb:elementName suffix="Element"/>
</jxb:nameXmlTransform>
</jxb:schemaBindings>