WSDL-файл для Apache CXF с телом «любой xml» - PullRequest
3 голосов
/ 19 мая 2011

Справочная информация: я разрабатываю веб-сервис, который взаимодействует по протоколу WS-Management.Исходный WSDL отсюда http://schemas.xmlsoap.org/ws/2005/06/management/wsman.wsdl выглядит следующим образом:

<xs:complexType name="SampleResourceType">
  <xs:sequence>
     <xs:element name="PropertyA" type="xs:string"/>
     <xs:element name="PropertyB" type="xs:int"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="SampleResource" type="tns:SampleResourceType"/>

<wsdl:message name="PutMessage">
  <wsdl:part name="Body" element="tns:SampleResource"/>
</wsdl:message>

И этот WSDL хорошо работает с Apache CXF 2.4.0.

Моя цель: заменить определение SampleResource другимпусть операция обрабатывает любой ресурс (XML).Я хотел бы создать файл WSDL для работы, который будет выглядеть так:

<soap:Envelope>
  <soap:Body>
    <SomeXmlDocument></SomeXmlDocument>
  </soap:Body>
</soap:Envelope>

И SomeXmlDocument означает здесь любой XML-документ, определенный во время выполнения.Проблема сейчас в CXF всегда ставит предопределенное имя из WSDL.Я покажу на примерах:

Я использую следующую команду: wsdl2java.bat -fe jaxws21 -d gen -exsh true -verbose file.wsdl

Если я использую wsdl:

  <xs:complexType name="CIMObjectType">
    <xs:sequence>
      <xs:any namespace="##other" minOccurs="0" processContents="lax"/> 
    </xs:sequence>
  </xs:complexType>
  <xs:element name="CIMObject" type="tns:CIMObjectType"/>

  <wsdl:message name="GetResponseMessage">
     <wsdl:part name="Body" element="tns:CIMObject"/>
  </wsdl:message>

Вывод выглядит так:

<soap:Body>
  <ns8:CIMObject>
    <XXX>
      <DeviceID>XXX:YYY</DeviceID>
    </XXX>
  </ns8:CIMObject>
</soap:Body>

Если я использую:

  <xs:complexType name="CIMObjectType">
    <xs:sequence>
      <xs:any namespace="##other" minOccurs="0" processContents="lax"/> 
    </xs:sequence>
  </xs:complexType>
  <xs:element name="CIMObject" type="tns:CIMObjectType"/>

  <wsdl:message name="GetResponseMessage">
     <wsdl:part name="Body" type="tns:CIMObjectType"/>
  </wsdl:message>

Вывод выглядит так:

<soap:Body>
  <Body>
    <XXX>
      <DeviceID>XXX:YYY</DeviceID>
    </XXX>
  </Body>
</soap:Body>

Но мне нужно:

<soap:Body>
    <XXX>
      <DeviceID>XXX:YYY</DeviceID>
    </XXX>
</soap:Body>

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

...