Axis 1.4无法反序列化响应

时间:2017-04-17 20:04:15

标签: java wsdl axis wsdl2java

我实现了访问旧服务的客户端,经过一些研究后我发现我需要用户Axis 1.4与此服务进行通信。从wsdl生成java代码后,我可以看到Axis没有正确地反序列化响应,看起来它正在读取元素,好像它是另一个。

这是该服务的解决方案:

<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" name="PC_Precoservice" targetNamespace="http://tempuri.org/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:ns1="urn:uResultadoPreco" xmlns:ns2="urn:uRequisicao" xmlns:ns3="urn:uPreco">
  <types>
    <xs:schema targetNamespace="urn:uResultadoPreco" xmlns="urn:uResultadoPreco">
      <xs:complexType name="TResultadoPreco">
        <xs:sequence>
          <xs:element name="StatusRetorno" type="ns2:TRequisicaoPreco"/>
          <xs:element name="Dados" type="ns3:TArrayPreco"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
    <xs:schema targetNamespace="urn:uRequisicao" xmlns="urn:uRequisicao">
      <xs:complexType name="TRequisicaoPreco">
        <xs:sequence>
          <xs:element name="Codigo" type="xs:int"/>
          <xs:element name="Mensagem" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
    <xs:schema targetNamespace="urn:uPreco" xmlns="urn:uPreco">
      <xs:complexType name="TArrayPreco">
        <xs:complexContent>
          <xs:restriction base="soapenc:Array">
            <xs:sequence/>
            <xs:attribute ref="soapenc:arrayType" n1:arrayType="ns3:TPreco[]" xmlns:n1="http://schemas.xmlsoap.org/wsdl/"/>
          </xs:restriction>
        </xs:complexContent>
      </xs:complexType>
      <xs:complexType name="TPreco">
        <xs:sequence>
          <xs:element name="codigo_produto" type="xs:int"/>
          <xs:element name="preco_venda" type="xs:double"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
  </types>
  <message name="Pesquisar0Request">
    <part name="Codigo_Produto" type="xs:int"/>
  </message>
  <message name="Pesquisar0Response">
    <part name="return" type="ns1:TResultadoPreco"/>
  </message>
  <message name="PesquisarPorRegiao1Request">
    <part name="Codigo_Produto" type="xs:int"/>
    <part name="Numero_Regiao" type="xs:int"/>
  </message>
  <message name="PesquisarPorRegiao1Response">
    <part name="return" type="ns1:TResultadoPreco"/>
  </message>
  <message name="PesquisarPorRegiaoPorFilial2Request">
    <part name="Codigo_Produto" type="xs:int"/>
    <part name="Numero_Regiao" type="xs:int"/>
    <part name="Codigo_Filial" type="xs:string"/>
  </message>
  <message name="PesquisarPorRegiaoPorFilial2Response">
    <part name="return" type="ns1:TResultadoPreco"/>
  </message>
  <portType name="PC_Preco">
    <operation name="Pesquisar">
      <input message="tns:Pesquisar0Request"/>
      <output message="tns:Pesquisar0Response"/>
    </operation>
    <operation name="PesquisarPorRegiao">
      <input message="tns:PesquisarPorRegiao1Request"/>
      <output message="tns:PesquisarPorRegiao1Response"/>
    </operation>
    <operation name="PesquisarPorRegiaoPorFilial">
      <input message="tns:PesquisarPorRegiaoPorFilial2Request"/>
      <output message="tns:PesquisarPorRegiaoPorFilial2Response"/>
    </operation>
  </portType>
  <binding name="PC_Precobinding" type="tns:PC_Preco">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="Pesquisar">
      <soap:operation soapAction="urn:uPCPrecoIntf-PC_Preco#Pesquisar" style="rpc"/>
      <input>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:uPCPrecoIntf-PC_Preco"/>
      </input>
      <output>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:uPCPrecoIntf-PC_Preco"/>
      </output>
    </operation>
    <operation name="PesquisarPorRegiao">
      <soap:operation soapAction="urn:uPCPrecoIntf-PC_Preco#PesquisarPorRegiao" style="rpc"/>
      <input>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:uPCPrecoIntf-PC_Preco"/>
      </input>
      <output>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:uPCPrecoIntf-PC_Preco"/>
      </output>
    </operation>
    <operation name="PesquisarPorRegiaoPorFilial">
      <soap:operation soapAction="urn:uPCPrecoIntf-PC_Preco#PesquisarPorRegiaoPorFilial" style="rpc"/>
      <input>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:uPCPrecoIntf-PC_Preco"/>
      </input>
      <output>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:uPCPrecoIntf-PC_Preco"/>
      </output>
    </operation>
  </binding>
  <service name="PC_Precoservice">
    <port name="PC_PrecoPort" binding="tns:PC_Precobinding">
      <soap:address location="http://192.168.1.13/PCSIS2699.EXE/soap/PC_Preco"/>
    </port>
  </service>
</definitions>

当我调用方法时

TResultadoPreco Pesquisar(int Codigo_Produto)

服务返回以下响应(使用SoapUI获取):

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <return>
         <StatusRetorno>
            <Codigo>0</Codigo>
            <Mensagem>OK</Mensagem>
         </StatusRetorno>
         <Dados>
            <item>
               <codigo_produto>63768</codigo_produto>
               <preco_venda>8.35</preco_venda>
            </item>
         </Dados>
      </return>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

但是我的客户收到此错误:

AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: org.xml.sax.SAXException: Invalid element in com.brevleq.padrao_taf.clients.pc_preco.uResultadoPreco.TResultadoPreco - Codigo
 faultActor: 
 faultNode: 
 faultDetail: 
{http://xml.apache.org/axis/}stackTrace:org.xml.sax.SAXException: Invalid element in com.brevleq.padrao_taf.clients.pc_preco.uResultadoPreco.TResultadoPreco - Codigo

我无法理解我的客户端有什么问题,因为代码是自动生成的,它应该可以正常工作。

这些是wsdl2java生成的一些文件:

PC_PrecobindingStub

public class PC_PrecobindingStub extends org.apache.axis.client.Stub implements PC_Preco {
private java.util.Vector cachedSerClasses = new java.util.Vector();
private java.util.Vector cachedSerQNames = new java.util.Vector();
private java.util.Vector cachedSerFactories = new java.util.Vector();
private java.util.Vector cachedDeserFactories = new java.util.Vector();

static org.apache.axis.description.OperationDesc[] _operations;

static {
    _operations = new org.apache.axis.description.OperationDesc[3];
    _initOperationDesc1();
}

private static void _initOperationDesc1() {
    org.apache.axis.description.OperationDesc oper;
    org.apache.axis.description.ParameterDesc param;
    oper = new org.apache.axis.description.OperationDesc();
    oper.setName("Pesquisar");
    param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "Codigo_Produto"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"), int.class, false, false);
    oper.addParameter(param);
    oper.setReturnType(new javax.xml.namespace.QName("urn:uResultadoPreco", "TResultadoPreco"));
    oper.setReturnClass(TResultadoPreco.class);
    oper.setReturnQName(new javax.xml.namespace.QName("", "return"));
    oper.setStyle(org.apache.axis.constants.Style.RPC);
    oper.setUse(org.apache.axis.constants.Use.ENCODED);
    _operations[0] = oper;

    oper = new org.apache.axis.description.OperationDesc();
    oper.setName("PesquisarPorRegiao");
    param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "Codigo_Produto"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"), int.class, false, false);
    oper.addParameter(param);
    param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "Numero_Regiao"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"), int.class, false, false);
    oper.addParameter(param);
    oper.setReturnType(new javax.xml.namespace.QName("urn:uResultadoPreco", "TResultadoPreco"));
    oper.setReturnClass(TResultadoPreco.class);
    oper.setReturnQName(new javax.xml.namespace.QName("", "return"));
    oper.setStyle(org.apache.axis.constants.Style.RPC);
    oper.setUse(org.apache.axis.constants.Use.ENCODED);
    _operations[1] = oper;

    oper = new org.apache.axis.description.OperationDesc();
    oper.setName("PesquisarPorRegiaoPorFilial");
    param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "Codigo_Produto"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"), int.class, false, false);
    oper.addParameter(param);
    param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "Numero_Regiao"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"), int.class, false, false);
    oper.addParameter(param);
    param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "Codigo_Filial"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
    oper.addParameter(param);
    oper.setReturnType(new javax.xml.namespace.QName("urn:uResultadoPreco", "TResultadoPreco"));
    oper.setReturnClass(TResultadoPreco.class);
    oper.setReturnQName(new javax.xml.namespace.QName("", "return"));
    oper.setStyle(org.apache.axis.constants.Style.RPC);
    oper.setUse(org.apache.axis.constants.Use.ENCODED);
    _operations[2] = oper;

}

public PC_PrecobindingStub() throws org.apache.axis.AxisFault {
    this(null);
}

public PC_PrecobindingStub(java.net.URL endpointURL, javax.xml.rpc.Service service) throws org.apache.axis.AxisFault {
    this(service);
    super.cachedEndpoint = endpointURL;
}

public PC_PrecobindingStub(javax.xml.rpc.Service service) throws org.apache.axis.AxisFault {
    if (service == null) {
        super.service = new org.apache.axis.client.Service();
    } else {
        super.service = service;
    }
    ((org.apache.axis.client.Service) super.service).setTypeMappingVersion("1.2");
    java.lang.Class cls;
    javax.xml.namespace.QName qName;
    javax.xml.namespace.QName qName2;
    java.lang.Class beansf = org.apache.axis.encoding.ser.BeanSerializerFactory.class;
    java.lang.Class beandf = org.apache.axis.encoding.ser.BeanDeserializerFactory.class;
    java.lang.Class enumsf = org.apache.axis.encoding.ser.EnumSerializerFactory.class;
    java.lang.Class enumdf = org.apache.axis.encoding.ser.EnumDeserializerFactory.class;
    java.lang.Class arraysf = org.apache.axis.encoding.ser.ArraySerializerFactory.class;
    java.lang.Class arraydf = org.apache.axis.encoding.ser.ArrayDeserializerFactory.class;
    java.lang.Class simplesf = org.apache.axis.encoding.ser.SimpleSerializerFactory.class;
    java.lang.Class simpledf = org.apache.axis.encoding.ser.SimpleDeserializerFactory.class;
    java.lang.Class simplelistsf = org.apache.axis.encoding.ser.SimpleListSerializerFactory.class;
    java.lang.Class simplelistdf = org.apache.axis.encoding.ser.SimpleListDeserializerFactory.class;
    qName = new javax.xml.namespace.QName("urn:uPreco", "TArrayPreco");
    cachedSerQNames.add(qName);
    cls = TPreco[].class;
    cachedSerClasses.add(cls);
    qName = new javax.xml.namespace.QName("urn:uPreco", "TPreco");
    qName2 = null;
    cachedSerFactories.add(new org.apache.axis.encoding.ser.ArraySerializerFactory(qName, qName2));
    cachedDeserFactories.add(new org.apache.axis.encoding.ser.ArrayDeserializerFactory());

    qName = new javax.xml.namespace.QName("urn:uPreco", "TPreco");
    cachedSerQNames.add(qName);
    cls = TPreco.class;
    cachedSerClasses.add(cls);
    cachedSerFactories.add(beansf);
    cachedDeserFactories.add(beandf);

    qName = new javax.xml.namespace.QName("urn:uRequisicao", "TRequisicao");
    cachedSerQNames.add(qName);
    cls = TRequisicao.class;
    cachedSerClasses.add(cls);
    cachedSerFactories.add(beansf);
    cachedDeserFactories.add(beandf);

    qName = new javax.xml.namespace.QName("urn:uResultadoPreco", "TResultadoPreco");
    cachedSerQNames.add(qName);
    cls = TResultadoPreco.class;
    cachedSerClasses.add(cls);
    cachedSerFactories.add(beansf);
    cachedDeserFactories.add(beandf);

}

protected org.apache.axis.client.Call createCall() throws java.rmi.RemoteException {
    try {
        org.apache.axis.client.Call _call = super._createCall();
        if (super.maintainSessionSet) {
            _call.setMaintainSession(super.maintainSession);
        }
        if (super.cachedUsername != null) {
            _call.setUsername(super.cachedUsername);
        }
        if (super.cachedPassword != null) {
            _call.setPassword(super.cachedPassword);
        }
        if (super.cachedEndpoint != null) {
            _call.setTargetEndpointAddress(super.cachedEndpoint);
        }
        if (super.cachedTimeout != null) {
            _call.setTimeout(super.cachedTimeout);
        }
        if (super.cachedPortName != null) {
            _call.setPortName(super.cachedPortName);
        }
        java.util.Enumeration keys = super.cachedProperties.keys();
        while (keys.hasMoreElements()) {
            java.lang.String key = (java.lang.String) keys.nextElement();
            _call.setProperty(key, super.cachedProperties.get(key));
        }
        // All the type mapping information is registered
        // when the first call is made.
        // The type mapping information is actually registered in
        // the TypeMappingRegistry of the service, which
        // is the reason why registration is only needed for the first call.
        synchronized (this) {
            if (firstCall()) {
                // must set encoding style before registering serializers
                _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
                _call.setEncodingStyle(org.apache.axis.Constants.URI_SOAP11_ENC);
                for (int i = 0; i < cachedSerFactories.size(); ++i) {
                    java.lang.Class cls = (java.lang.Class) cachedSerClasses.get(i);
                    javax.xml.namespace.QName qName =
                            (javax.xml.namespace.QName) cachedSerQNames.get(i);
                    java.lang.Object x = cachedSerFactories.get(i);
                    if (x instanceof Class) {
                        java.lang.Class sf = (java.lang.Class)
                                cachedSerFactories.get(i);
                        java.lang.Class df = (java.lang.Class)
                                cachedDeserFactories.get(i);
                        _call.registerTypeMapping(cls, qName, sf, df, false);
                    } else if (x instanceof javax.xml.rpc.encoding.SerializerFactory) {
                        org.apache.axis.encoding.SerializerFactory sf = (org.apache.axis.encoding.SerializerFactory)
                                cachedSerFactories.get(i);
                        org.apache.axis.encoding.DeserializerFactory df = (org.apache.axis.encoding.DeserializerFactory)
                                cachedDeserFactories.get(i);
                        _call.registerTypeMapping(cls, qName, sf, df, false);
                    }
                }
            }
        }
        return _call;
    } catch (java.lang.Throwable _t) {
        throw new org.apache.axis.AxisFault("Failure trying to get the Call object", _t);
    }
}

public TResultadoPreco pesquisar(int codigo_Produto) throws java.rmi.RemoteException {
    if (super.cachedEndpoint == null) {
        throw new org.apache.axis.NoEndPointException();
    }
    org.apache.axis.client.Call _call = createCall();
    _call.setOperation(_operations[0]);
    _call.setUseSOAPAction(true);
    _call.setSOAPActionURI("urn:uPCPrecoIntf-PC_Preco#Pesquisar");
    _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
    _call.setOperationName(new javax.xml.namespace.QName("urn:uPCPrecoIntf-PC_Preco", "Pesquisar"));

    setRequestHeaders(_call);
    setAttachments(_call);
    try {
        java.lang.Object _resp = _call.invoke(new java.lang.Object[]{new java.lang.Integer(codigo_Produto)});

        if (_resp instanceof java.rmi.RemoteException) {
            throw (java.rmi.RemoteException) _resp;
        } else {
            extractAttachments(_call);
            try {
                return (TResultadoPreco) _resp;
            } catch (java.lang.Exception _exception) {
                return (TResultadoPreco) org.apache.axis.utils.JavaUtils.convert(_resp, TResultadoPreco.class);
            }
        }
    } catch (org.apache.axis.AxisFault axisFaultException) {
        throw axisFaultException;
    }
}

public TResultadoPreco pesquisarPorRegiao(int codigo_Produto, int numero_Regiao) throws java.rmi.RemoteException {
    if (super.cachedEndpoint == null) {
        throw new org.apache.axis.NoEndPointException();
    }
    org.apache.axis.client.Call _call = createCall();
    _call.setOperation(_operations[1]);
    _call.setUseSOAPAction(true);
    _call.setSOAPActionURI("urn:uPCPrecoIntf-PC_Preco#PesquisarPorRegiao");
    _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
    _call.setOperationName(new javax.xml.namespace.QName("urn:uPCPrecoIntf-PC_Preco", "PesquisarPorRegiao"));

    setRequestHeaders(_call);
    setAttachments(_call);
    try {
        java.lang.Object _resp = _call.invoke(new java.lang.Object[]{new java.lang.Integer(codigo_Produto), new java.lang.Integer(numero_Regiao)});

        if (_resp instanceof java.rmi.RemoteException) {
            throw (java.rmi.RemoteException) _resp;
        } else {
            extractAttachments(_call);
            try {
                return (TResultadoPreco) _resp;
            } catch (java.lang.Exception _exception) {
                return (TResultadoPreco) org.apache.axis.utils.JavaUtils.convert(_resp, TResultadoPreco.class);
            }
        }
    } catch (org.apache.axis.AxisFault axisFaultException) {
        throw axisFaultException;
    }
}

public TResultadoPreco pesquisarPorRegiaoPorFilial(int codigo_Produto, int numero_Regiao, java.lang.String codigo_Filial) throws java.rmi.RemoteException {
    if (super.cachedEndpoint == null) {
        throw new org.apache.axis.NoEndPointException();
    }
    org.apache.axis.client.Call _call = createCall();
    _call.setOperation(_operations[2]);
    _call.setUseSOAPAction(true);
    _call.setSOAPActionURI("urn:uPCPrecoIntf-PC_Preco#PesquisarPorRegiaoPorFilial");
    _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
    _call.setOperationName(new javax.xml.namespace.QName("urn:uPCPrecoIntf-PC_Preco", "PesquisarPorRegiaoPorFilial"));

    setRequestHeaders(_call);
    setAttachments(_call);
    try {
        java.lang.Object _resp = _call.invoke(new java.lang.Object[]{new java.lang.Integer(codigo_Produto), new java.lang.Integer(numero_Regiao), codigo_Filial});

        if (_resp instanceof java.rmi.RemoteException) {
            throw (java.rmi.RemoteException) _resp;
        } else {
            extractAttachments(_call);
            try {
                return (TResultadoPreco) _resp;
            } catch (java.lang.Exception _exception) {
                return (TResultadoPreco) org.apache.axis.utils.JavaUtils.convert(_resp, TResultadoPreco.class);
            }
        }
    } catch (org.apache.axis.AxisFault axisFaultException) {
        throw axisFaultException;
    }
}
}

TResultadoPreco - 服务的预期响应

public class TResultadoPreco  implements java.io.Serializable {
private TRequisicao statusRetorno;

private TPreco[] dados;

public TResultadoPreco() {
}

public TResultadoPreco(
       TRequisicao statusRetorno,
       TPreco[] dados) {
       this.statusRetorno = statusRetorno;
       this.dados = dados;
}


/**
 * Gets the statusRetorno value for this TResultadoPreco.
 * 
 * @return statusRetorno
 */
public TRequisicao getStatusRetorno() {
    return statusRetorno;
}


/**
 * Sets the statusRetorno value for this TResultadoPreco.
 * 
 * @param statusRetorno
 */
public void setStatusRetorno(TRequisicao statusRetorno) {
    this.statusRetorno = statusRetorno;
}


/**
 * Gets the dados value for this TResultadoPreco.
 * 
 * @return dados
 */
public TPreco[] getDados() {
    return dados;
}


/**
 * Sets the dados value for this TResultadoPreco.
 * 
 * @param dados
 */
public void setDados(TPreco[] dados) {
    this.dados = dados;
}

private java.lang.Object __equalsCalc = null;
public synchronized boolean equals(java.lang.Object obj) {
    if (!(obj instanceof TResultadoPreco)) return false;
    TResultadoPreco other = (TResultadoPreco) obj;
    if (obj == null) return false;
    if (this == obj) return true;
    if (__equalsCalc != null) {
        return (__equalsCalc == obj);
    }
    __equalsCalc = obj;
    boolean _equals;
    _equals = true && 
        ((this.statusRetorno==null && other.getStatusRetorno()==null) || 
         (this.statusRetorno!=null &&
          this.statusRetorno.equals(other.getStatusRetorno()))) &&
        ((this.dados==null && other.getDados()==null) || 
         (this.dados!=null &&
          java.util.Arrays.equals(this.dados, other.getDados())));
    __equalsCalc = null;
    return _equals;
}

private boolean __hashCodeCalc = false;
public synchronized int hashCode() {
    if (__hashCodeCalc) {
        return 0;
    }
    __hashCodeCalc = true;
    int _hashCode = 1;
    if (getStatusRetorno() != null) {
        _hashCode += getStatusRetorno().hashCode();
    }
    if (getDados() != null) {
        for (int i=0;
             i<java.lang.reflect.Array.getLength(getDados());
             i++) {
            java.lang.Object obj = java.lang.reflect.Array.get(getDados(), i);
            if (obj != null &&
                !obj.getClass().isArray()) {
                _hashCode += obj.hashCode();
            }
        }
    }
    __hashCodeCalc = false;
    return _hashCode;
}

// Type metadata
private static org.apache.axis.description.TypeDesc typeDesc =
    new org.apache.axis.description.TypeDesc(TResultadoPreco.class, true);

static {
    typeDesc.setXmlType(new javax.xml.namespace.QName("urn:uResultadoPreco", "TResultadoPreco"));
    org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
    elemField.setFieldName("statusRetorno");
    elemField.setXmlName(new javax.xml.namespace.QName("", "StatusRetorno"));
    elemField.setXmlType(new javax.xml.namespace.QName("urn:uRequisicao", "TRequisicao"));
    elemField.setNillable(false);
    typeDesc.addFieldDesc(elemField);
    elemField = new org.apache.axis.description.ElementDesc();
    elemField.setFieldName("dados");
    elemField.setXmlName(new javax.xml.namespace.QName("", "Dados"));
    elemField.setXmlType(new javax.xml.namespace.QName("urn:uPreco", "TPreco"));
    elemField.setNillable(false);
    typeDesc.addFieldDesc(elemField);
}

/**
 * Return type metadata object
 */
public static org.apache.axis.description.TypeDesc getTypeDesc() {
    return typeDesc;
}

/**
 * Get Custom Serializer
 */
public static org.apache.axis.encoding.Serializer getSerializer(
       java.lang.String mechType, 
       java.lang.Class _javaType,  
       javax.xml.namespace.QName _xmlType) {
    return 
      new  org.apache.axis.encoding.ser.BeanSerializer(
        _javaType, _xmlType, typeDesc);
}

/**
 * Get Custom Deserializer
 */
public static org.apache.axis.encoding.Deserializer getDeserializer(
       java.lang.String mechType, 
       java.lang.Class _javaType,  
       javax.xml.namespace.QName _xmlType) {
    return 
      new  org.apache.axis.encoding.ser.BeanDeserializer(
        _javaType, _xmlType, typeDesc);
}
}

1 个答案:

答案 0 :(得分:0)

我尝试使用JAX-RPC实现客户端但是我得到了同样的错误。尝试修改客户端处理响应的方式,但我得到了一些其他错误。所以我放弃了使用第三方SOAP客户端并实现了一个http客户端发送和接收数据为String:

@Component
public class PCPrecoClient {

    private final Logger log = LoggerFactory.getLogger(PCPrecoClient.class);
    private final HttpHeaders defaultHeaders = new HttpHeaders();
    private final RestTemplate restTemplate = new RestTemplate();

    public PCPrecoClient() {
        defaultHeaders.setContentType(MediaType.TEXT_XML);
        defaultHeaders.set("SOAPAction","urn:uPCPrecoIntf-PC_Preco#Pesquisar");
        defaultHeaders.setAcceptCharset(Collections.singletonList(Charset.forName("UTF-8")));
    }

    public BigDecimal pesquisar(int codigoProduto){
        String requestBody="<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:uPCPrecoIntf-PC_Preco\">\n" +
            "   <soapenv:Header/>\n" +
            "   <soapenv:Body>\n" +
            "      <urn:Pesquisar soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n" +
            "         <Codigo_Produto xsi:type=\"xsd:int\">"+codigoProduto+"</Codigo_Produto>\n" +
            "      </urn:Pesquisar>\n" +
            "   </soapenv:Body>\n" +
            "</soapenv:Envelope>";
        HttpEntity<String> httpEntity = new HttpEntity<String>(requestBody, defaultHeaders);
        String finalUrl = "http://192.168.1.13/PCSIS2699.EXE/soap/PC_Preco";
        try {
            ResponseEntity<String> response = restTemplate.exchange(finalUrl, HttpMethod.POST, httpEntity, String.class);
            return extrairPreco(response.getBody());
        } catch (Exception e) {
            log.error(e.getLocalizedMessage());
            return null;
        }
    }

    private BigDecimal extrairPreco(String responseBody) {
        String tagAbertura="<preco_venda>";
        int startIndex=responseBody.indexOf(tagAbertura)+tagAbertura.length();
        int endIndex=responseBody.indexOf("</preco_venda>");
        if(startIndex==-1 || endIndex==-1)
            return null;
        return new BigDecimal(responseBody.substring(startIndex,endIndex));

    }
}

至少它现在正在运作。