2014-09-22 122 views
1

我有一个工作的Web服务与轴1发,而且我将其迁移到JAXWSJAXWS不填充结果

我创建从我的工作WSDL文件我用的wsimport和Maven的客户端类。

我的问题是,我可以看到我的记录器中的数据,我的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中有错误,或者插件没有正确创建头文件?

谢谢。

回答

0

我找到了解决我的问题的方法。

如果我们检查响应SOAP消息,我们可以看到只有一个模式(http://ws.test),所以属于第二个模式的其他元素不能被转换,因为jaxws没有找到匹配。

我不能修改Web服务,因为它不是我的,所以我调整了我的wsdl只有1个模式。我想这不是最干净的解决方案,但它的工作原理。

这里是如何做到这一点的例子:

<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>