2011-08-31 23 views
17

Estoy generando el código de cliente de java desde un wsdl usando 'wsimport'. El WSDL tiene jabón: cabecera en las definiciones de operación como estawsimport no genera código relacionado con los encabezados de soap

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.test.com/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://www.test.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Test session web service methods.</wsdl:documentation> 
    <wsdl:types> 
    <s:schema elementFormDefault="qualified" targetNamespace="http://www.test.com/"> 
     <s:element name="Logon"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="user" type="s:string" /> 
      <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string" /> 
      <s:element minOccurs="0" maxOccurs="1" name="organisation" type="s:string" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:element name="LogonResponse"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="1" maxOccurs="1" name="LogonResult" type="tns:LogonResult" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:simpleType name="LogonResult"> 
     <s:restriction base="s:string"> 
      <s:enumeration value="Ok" /> 
      <s:enumeration value="Error" /> 
     </s:restriction> 
     </s:simpleType> 
     <s:element name="Header" type="tns:Header" /> 
     <s:complexType name="Header"> 
     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="SessionID" type="s:string" /> 
     </s:sequence> 
     <s:anyAttribute /> 
     </s:complexType> 
     <s:element name="RunTask"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="argument" type="s:string" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:element name="RunTaskResponse"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="1" maxOccurs="1" name="RunTaskResult" type="tns:RunTaskResult" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:simpleType name="RunTaskResult"> 
     <s:restriction base="s:string"> 
      <s:enumeration value="Ok" /> 
      <s:enumeration value="Error" /> 
     </s:restriction> 
     </s:simpleType> 
    </s:schema> 
    </wsdl:types> 
    <wsdl:message name="LogonSoapIn"> 
    <wsdl:part name="parameters" element="tns:Logon" /> 
    </wsdl:message> 
    <wsdl:message name="LogonSoapOut"> 
    <wsdl:part name="parameters" element="tns:LogonResponse" /> 
    </wsdl:message> 
    <wsdl:message name="LogonHeader"> 
    <wsdl:part name="Header" element="tns:Header" /> 
    </wsdl:message> 
    <wsdl:message name="RunTaskSoapIn"> 
    <wsdl:part name="parameters" element="tns:RunTask" /> 
    </wsdl:message> 
    <wsdl:message name="RunTaskSoapOut"> 
    <wsdl:part name="parameters" element="tns:RunTaskResponse" /> 
    </wsdl:message> 
    <wsdl:message name="RunTaskHeader"> 
    <wsdl:part name="Header" element="tns:Header" /> 
    </wsdl:message> 
    <wsdl:portType name="SessionSoap"> 
    <wsdl:operation name="Logon"> 
     <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Logs on with the user credentials.</wsdl:documentation> 
     <wsdl:input message="tns:LogonSoapIn" /> 
     <wsdl:output message="tns:LogonSoapOut" /> 
    </wsdl:operation> 
    <wsdl:operation name="RunTask"> 
     <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Runs a task.</wsdl:documentation> 
     <wsdl:input message="tns:RunTaskSoapIn" /> 
     <wsdl:output message="tns:RunTaskSoapOut" /> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="SessionSoap" type="tns:SessionSoap"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="Logon"> 
     <soap:operation soapAction="http://www.test.com/Logon" style="document" /> 
     <wsdl:input> 
     <soap:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" /> 
     <soap:header message="tns:LogonHeader" part="Header" use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    <wsdl:operation name="RunTask"> 
     <soap:operation soapAction="http://www.test.com/RunTask" style="document" /> 
     <wsdl:input> 
     <soap:body use="literal" /> 
     <soap:header message="tns:RunTaskHeader" part="Header" use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="Session"> 
    <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Test session web service methods.</wsdl:documentation> 
    <wsdl:port name="SessionSoap" binding="tns:SessionSoap"> 
     <soap:address location="https://login.test.com/webservices/session.asmx" /> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Esto indica que un mensaje de solicitud de inicio de sesión se vería así

<?xml version="1.0"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XmlSchema-instance" xmlns:xsd="http://www.w3.org/2001/XmlSchema"> 
    <soap:Body> 
    <Logon xmlns="http://www.test.com/"> 
     <user>its_me</user> 
     <password>its_my_pwd</password> 
     <organisation>my_org</organisation> 
    </Logon> 
    </soap:Body> 
</soap:Envelope> 

y la respuesta como esta

<?xml version="1.0"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Header> 
    <Header xmlns="http://www.test.com/"> 
     <SessionID>ddffdf334-217d-41bb-9d7e-6289fefa8aaf</SessionID> 
    </Header> 
    </soap:Header> 
    <soap:Body> 
    <LogonResponse xmlns="http://www.test.com/"> 
     <LogonResult>Ok</LogonResult> 
    </LogonResponse> 
    </soap:Body> 
</soap:Envelope> 
+11

Yay, lo encontré yo mismo. Agregar la opción '-Xadirectorias' al comando wsimport resolvió el problema. Genera un argumento adicional para el método a través del cual se puede pasar/recuperar el encabezado. No eliminé la pregunta porque no pude encontrar esta solución en el desbordamiento de la pila y, como tal, podría ser útil. – thehpi

+1

¡Gracias! .. ps: este es el éxito principal para "encabezado de configuración de wsimport" en google! –

Respuesta

1

I No pude comentar, así que estoy escribiendo esto aquí como una "respuesta".

Me encontré con la misma situación donde solo había cuerpo en el sobre. Sin embargo, después de agregar el argumento '-XAdditionalHeaders', wsimport aún se negó a generar métodos de servicio con argumentos de encabezado. Busqué en Internet y encontré un parche manual en el siguiente enlace:

https://metro.java.net/2.0/guide/SOAP_headers.html

que no lo hizo en el código. En su lugar, cambié la firma de método del método de operación del servicio web agregando argumentos para el encabezado de solicitud y anotándolos con @WebParam(header=true). No lo he probado con un servidor de servicio web real, pero al menos el mensaje SOAP ahora parece correcto (ya no tiene cabeza).

0

-exsh (verdadero/falso)

Activa o desactiva el procesamiento de cabeceras SOAP implícitos (es decir, cabeceras SOAP definidas en el WSDL: unión pero no WSDL:. Sección portType) procesar los encabezados SOAP requiere los frascos de unión de SOAP disponible en el classpath, que no era el predeterminado en CXF 2.4.xy versiones anteriores. Es posible que deba agregar una dependencia a cxf-rt-binding-soap para que funcione esta marca. El valor predeterminado es falso.

Cuestiones relacionadas