Jaxws не заполняет результаты
У меня есть работающий веб-сервис, созданный с помощью Axis1, и я перевожу его на Jaxws
Я создаю свои клиентские классы с помощью wsimport и maven из моего рабочего файла WSDL.
У меня проблема в том, что я могу видеть мое ответное сообщение SOAP с данными в моем логгере, но объекты не заполнены этими данными.
Мой wsdl выглядит так (я разместил только 1 сервис, чтобы сделать его короче, и удалил некоторые элементы, поэтому, пожалуйста, игнорируйте, если есть какие-то пропущенные, такие как ResultadoProcesamiento):
<wsdl:definitions targetNamespace="http://ws.test" xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://ws.test"
xmlns:intf="http://ws.test"
xmlns:tns1="http://pojo.test"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://ws.test" xmlns="http://www.w3.org/2001/XMLSchema" >
<import namespace="http://pojo.test"/>
<element name="validarCertificado">
<complexType>
<sequence>
<element name="cert" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="validarCertificadoResponse">
<complexType>
<sequence>
<element name="validarCertificadoReturn" type="tns1:MensajeSalida"/>
</sequence>
</complexType>
</element>
</schema>
<schema elementFormDefault="qualified" targetNamespace="http://pojo.test" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://ws.test"/>
<complexType name="Respuesta">
<sequence>
<element name="excepcion" nillable="true" type="tns1:Excepcion"/>
<element name="resultadoProcesamiento" nillable="true" type="tns1:ResultadoProcesamiento"/>
</sequence>
</complexType>
<complexType name="MensajeSalida">
<sequence>
<element name="peticion" nillable="true" type="xsd:string"/>
<element name="respuesta" nillable="true" type="tns1:Respuesta"/>
<element name="versionMsg" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="validarCertificadoRequest">
<wsdl:part element="impl:validarCertificado" name="parameters"/>
</wsdl:message>
<wsdl:message name="validarCertificadoResponse">
<wsdl:part element="impl:validarCertificadoResponse" name="parameters"/>
</wsdl:message>
<wsdl:portType name="WsTest">
<wsdl:operation name="validarCertificado">
<wsdl:input message="impl:validarCertificadoRequest" name="validarCertificadoRequest"/>
<wsdl:output message="impl:validarCertificadoResponse" name="validarCertificadoResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="WsTestSoapBinding" type="impl:WsTest">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="validarCertificado">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="validarCertificadoRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="validarCertificadoResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="WsTestService">
</wsdl:service>
</wsdl:definitions>
Я заставил создать 2 пакета, потому что у меня было несколько элементов с одинаковым именем, но из разных схем.
Первый пакет:
package-info.java
@XmlSchema(namespace = "http://ws.test", elementFormDefault = XmlNsForm.QUALIFIED)
package test.ws;
ValidarCertificadoResponse.java
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "validarCertificadoReturn" })
@XmlRootElement(name = "validarCertificadoResponse")
public class ValidarCertificadoResponse {
@XmlElement(required = true)
protected MensajeSalida validarCertificadoReturn;
Второй пакет:
package-info.java
@XmlSchema(namespace = "http://pojo.test", elementFormDefault = XmlNsForm.QUALIFIED)
package pojo.ws;
MensajeSalida.java
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MensajeSalida", propOrder = { "peticion", "respuesta", "versionMsg" })
public class MensajeSalida {
@XmlElement(required = true, nillable = true)
protected String peticion;
@XmlElement(required = true, nillable = true)
protected Respuesta respuesta;
@XmlElement(required = true, nillable = true)
protected String versionMsg;
И мое ответное SOAP-сообщение (оно включает только некоторые теги):
<soapenv:Body>
<validarCertificadoResponse xmlns="http://ws.test">
<validarCertificadoReturn>
<peticion>value1</peticion>
<respuesta>
datas
<respuesta/>
<resultadoProcesamiento>
more datas
</resultadoProcesamiento>
После выполнения клиента, сгенерированного jaxws-maven-plugin:2.3, мой ValidarCertificadoResponse имеет следующие атрибуты:
ValidarCertificadoResponse.java
validarCertificadoReturn
peticion = null;
respuesta = null;
resultadoProcesamiento = null;
Вы находите что-то не так? Я предполагаю, что в WSDL есть ошибки или, возможно, плагин не создает заголовки должным образом?
Благодарю.
1 ответ
Я нашел решение своей проблемы.
Если мы проверим ответное SOAP-сообщение, то увидим, что существует только одна именованная схема ( http://ws.test/), поэтому любой другой элемент, принадлежащий второй схеме, не может быть преобразован, поскольку jaxws не находит соответствия.
Я не могу изменить веб-сервис, потому что он не мой, поэтому я настроил свой wsdl так, чтобы он имел только одну схему. Я думаю, это не самое чистое решение, но оно работает.
Вот пример того, как это сделать:
ДО:
<element name="validarCertificadoResponse">
<complexType>
<sequence>
<element name="validarCertificadoReturn" type="tns1:MensajeSalida"/>
</sequence>
</complexType>
</element>
ПОСЛЕ:
<xsd:element name="validarCertificadoResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="validarCertificadoReturn">
<!-- This is the content of tns1:MensajeSalida -->
<xsd:complexType>
<xsd:sequence>
<xsd:element name="peticion" type="xsd:string"/>
<!-- This is the content of tns1:Respuesta -->
<xsd:element name="respuesta">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="excepcion" nillable="true">
<!-- This is the content of tns1:Excepcion -->
<xsd:complexType>
<xsd:sequence>
<xsd:element name="codigoError" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="resultadoProcesamiento" nillable="true">
<!-- This is the content of tns1:ResultadoProcesamiento -->
<xsd:complexType>
<xsd:sequence>
<xsd:element name="resultado" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="versionMsg" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>