Можно ли управлять повторяющимися именами элементов с помощью Axis2/XmlBeans

Мы используем сторонние файлы wsdl, которые мы создаем с помощью файлов Java с помощью axis2. Теперь у нас есть проблема, что есть повторяющиеся элементы в разных файлах, но с одним и тем же пространством имен.

Пример:

file1.wsdl => <xsd:element name="MyElementName"> 
file2.wsdl => <xsd:element name="MyElementName"> 

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

Мне было интересно, действительно ли это правильно или это недостаток дизайна файлов wsdl? Если нет, то как мне обойти эту проблему с помощью axis2?

РЕДАКТИРОВАТЬ

Итак, я нашел флаг, позволяющий использовать разные пакеты для классов, так что теперь у меня есть

com.package.MyElementName
com.package.ext.MyElementName

Однако это все еще не работает, потому что ось (или xmlbeans) возвращает мне неправильный класс.

Взгляните на этот пример. Я бы предположил, что это сработает, но вместо этого я получаю ClassCastException

java.lang.ClassCastException: com.package.MyElementName.impl.MyElementNameDocumentImpl нельзя преобразовать в com.package.ext.MyElementNameDocument

com.mypackage.ext.MyElementNameDocument doc1 =
   com.mypackage.ext.MyElementNameDocument.Factory.newInstance();
doc1.addNewMyElementName();

com.mypackage.ext.MyElementNameDocument doc2 = 
  com.mypackage.ext.MyElementNameDocument.Factory.parse(doc1.toString());

РЕДАКТИРОВАТЬ--

Хорошо, я нашел реальные примеры в Интернете, так что я мог бы также показать настоящие.

http://dtd.cobaltgroup.com/STAR/5.2.4/WSDL/Templates/

Среди многих других есть эти два

http://dtd.cobaltgroup.com/STAR/5.2.4/WSDL/Templates/GetServiceProcessingAdvisory.wsdl http://dtd.cobaltgroup.com/STAR/5.2.4/WSDL/Templates/GetStandardCodes.wsdl

Как видите, в обоих есть элемент ProcessMessage. Надеюсь, это что-то прояснит.

 </xsd:complexType>
     <!--Global Elements used by the Bindings--><xsd:element name="ProcessMessage">
        <xsd:annotation>
           <xsd:documentation source="http://www.starstandard.org">
                Process Message Input
            </xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
           <xsd:sequence>
              <xsd:element name="payload"
 type="starws:GetServiceProcessingAdvisoryPayload" minOccurs="0"
                           maxOccurs="1"
                           form="qualified"/>
           </xsd:sequence>
        </xsd:complexType>
     </xsd:element>


 <!--Global Elements used by the Bindings--><xsd:element name="ProcessMessage">
        <xsd:annotation>
           <xsd:documentation source="http://www.starstandard.org">
                Process Message Input
            </xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
           <xsd:sequence>
              <xsd:element name="payload" type="starws:GetStandardCodesPayload" 
  minOccurs="0"
                           maxOccurs="1"
                           form="qualified"/>
           </xsd:sequence>
        </xsd:complexType>
     </xsd:element>

....

С уважением /Йохан


person jrask    schedule 18.10.2012    source источник


Ответы (1)


По крайней мере, очень плохой wsdl-дизайн производителя (особенно для того, который содержит слово «стандарт» в названии своей компании): глобальные определения типов/элементов должны быть сделаны один раз и т.е. помещены в отдельный глобальный XSD-файл (например, здесь делали:

 <xsd:include schemaLocation="STARWSDLDataTypes.xsd"/>

).

Кроме того, пространство имен служб должно оставаться специфичным для служб, чтобы обеспечить гибкость в отношении управления версиями служб.

Я боюсь, что это фактическое созвездие (объявление повторяющихся элементов в тех же пространствах имен + wsdls) является темой серой зоны - я не нашел четкого заявления по этому поводу в сети, поэтому ваше единственное решение может заключаться в разработке для обоих wsdl-файлов, полностью разделенных. Это означает 2 приложения по оси 2 (по 1 на wsdl) вместо одного общего.

person Aydin K.    schedule 22.10.2012
comment
Большое спасибо за ответ. Мой текущий подход состоит в том, чтобы изолировать каждый wsdl, но мне это очень не нравится. Я строю клиент и не хочу, чтобы каждый wsdl был отдельным jvm, он нам плохо подходит. Я мог бы использовать разные загрузчики классов, но это все равно отстой... В любом случае, я попытаюсь связаться с некоторыми из стандартных парней и дать им некоторые отзывы по этому поводу. - person jrask; 22.10.2012