jaxb - ejemplo - wsimport no genera código relacionado con encabezados de jabón
wsimport from wsdl file (2)
-exsh (verdadero / falso)
Activa o desactiva el procesamiento de encabezados SOAP implícitos (es decir, los encabezados SOAP definidos en la sección wsdl: binding pero no wsdl: portType). El procesamiento de los encabezados SOAP requiere los archivos jar de SOAP disponibles en el classpath que no era el predeterminado en CXF 2.4.x y más viejo. Es posible que deba agregar una dependencia a cxf-rt-binding-soap para que este indicador funcione. El valor predeterminado es falso.
Estoy generando el código java del cliente desde un wsdl usando ''wsimport''. El wsdl tiene soap: header en las definiciones de operación como esta
<?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 inicio de sesión de solicitud 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>
No pude comentar así que estoy escribiendo esto aquí como una "respuesta".
Me encontré con la misma situación donde solo había un 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
No lo hice en el código. En cambio, cambié la firma del método del método de operación del servicio web agregando argumentos para el encabezado de la solicitud y @WebParam(header=true)
con @WebParam(header=true)
. No lo he probado con un servidor de servicios web real, pero al menos el mensaje SOAP ahora parece correcto (ya no está sin cabeza).