WebServiceTemplate错误:'尚未声明前缀'soapenv'的命名空间

时间:2019-01-22 07:57:28

标签: java spring web-services soap

我遇到错误:“未声明前缀'soapenv'的命名空间。”

这是我正在使用的wsdl,您可以在此gist

上看到它

我的代码是这样的。

AppContext.xml

<!-- Wrapper del cliente  -->
<bean id="registroStub" class="es.sescam.sofos.registrounico.RegistroCliente">
    <property name="webServiceTemplate" ref="wsTemplate"/>
</bean>

<!-- Plantilla para comunicarnos con el WS -->
<bean id="wsTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
    <property name="defaultUri" value="http://registrounicoaplicaciones-desa.jccm.es/registrounicoaplicaciones/services/RegistroTelematicoWS"/>

    <!-- Creación de mensajes SOAP -->
    <property name="messageFactory">
          <!-- Saaj usa DOM, si se quiere más rendimiento y consumir menos recursos
               puede usar: org.springframework.ws.soap.axiom.AxiomSoapMessageFactory 
               que usa AXIOM. -->

        <bean name="innermf" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
            <property name="soapVersion">
                <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12"/>
            </property>
        </bean>         
    </property>

    <!-- Envio de mensajes, Spring proporciona dos clases el envio de mensajes sobre HTTP:
        a) org.springframework.ws.transport.http.HttpUrlConnectionMessageSender: 
           Usa HTTPConnection (funcionalidad limitada) 
        b) org.springframework.ws.transport.http.CommonsHttpMessageSender: 
           Usa HTTPClient (proporciona más funcionalidad)
           http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=HTTPClient
     -->        
    <property name="messageSender">
          <bean class="org.springframework.ws.transport.http.HttpUrlConnectionMessageSender"/>
    </property>
</bean>

RegistroClienteTest.java(加载上下文的类)

public class RegistroClienteTest {

    public void test1(){

    XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("AppContext.xml"));  

    RegistroCliente     stub    = (RegistroCliente) factory.getBean("registroStub");
    String  numeroRU    =  stub.getRegistroUnico();
    if (numeroRU != null){

        System.out.println("OK!");

    } else {
        System.out.println("NOK!");
    }

    }
}

RegistroCliente.java(调用WS的类)

public class RegistroCliente {

private final String URI = "http://registrounicoaplicaciones-desa.jccm.es/registrounicoaplicaciones/services/RegistroTelematicoWS";
private WebServiceTemplate webServiceTemplate;

/**
 * Será inyectada por Spring
 */
public void setWebServiceTemplate(WebServiceTemplate webServiceTemplate) {
    this.webServiceTemplate = webServiceTemplate;
}

public String getRegistroUnico() {

    String       xmlRequest = this.getPeticion();
    StreamSource peticion   = new StreamSource(new StringReader(xmlRequest));
    DOMResult    respuesta  = new DOMResult();
    String numeroRU = null;

    boolean hayRespuesta = webServiceTemplate.sendSourceAndReceiveToResult(URI, peticion, respuesta);
    if (hayRespuesta){
        numeroRU = this.resultToRegistroUnico((Document) respuesta.getNode());
    }
    return numeroRU;
}

/**
 * @return Genera la petición (payload) que se enviará al servicio Web
 */
private String getPeticion(){
    StringBuffer buffer = new StringBuffer(1024);
    buffer.append("<ws:RegistrarEntrada xmlns:ws=\"http://ws.rtaws.rtaws.jccm.es\"> ");
    buffer.append("<sUsuario>user</sUsuario>");
    buffer.append("<sClave>pass</sClave>");
    buffer.append("<strXML>");

    buffer.append("&lt;Datos&gt;&lt;AcuseRecibo&gt;N&lt;/AcuseRecibo&gt;&lt;CodSIACI&gt;SJT3&lt;/CodSIACI&gt;&lt;CodUniOrgDest&gt;850&lt;/CodUniOrgDest&gt;&lt;Observaciones&gt;Registro de Solicitud Bolsa del SESCAM.&lt;/Observaciones&gt;&lt;ExisteRep&gt;N&lt;/ExisteRep&gt;&lt;Interesado&gt;&lt;Int_TipoDoc&gt;N&lt;/Int_TipoDoc&gt;&lt;Int_NifCif&gt;39451114L&lt;/Int_NifCif&gt;&lt;Int_Nombre&gt;GONZALO&lt;/Int_Nombre&gt;&lt;Int_PrimerAp&gt;DE SANTIAGO&lt;/Int_PrimerAp&gt;&lt;Int_SegundoAp&gt;PEREZ&lt;/Int_SegundoAp&gt;&lt;/Interesado&gt;&lt;NumDocumentos&gt;0&lt;/NumDocumentos&gt;&lt;/Datos&gt;");

    buffer.append("</strXML>");
    buffer.append("</ws:RegistrarEntrada>");
    return buffer.toString();
}

/**
 * @return Devuelve una lista de Libro a partir del DOM
 */
private String resultToRegistroUnico(Document doc){
    NodeList nodos   = doc.getFirstChild().getChildNodes();
    Node     current = null;
    String numeroRU = null;
    for (int i = 0, num = nodos.getLength(); i < num; i++){
        current = nodos.item(i);

        System.out.println(current);

    }

    return numeroRU;
}

}

这是我的日志中的结果

  

17:43:59,847已发送调试:619-发送请求[userpass N SJT3 850 注册请求布尔萨德尔SESCAM。 Int_PrimerAp> PEREZ 0 ]

     

17:44:01,936收到的调试信息:675-收到的响应[RegistrarEntradaReturn <?xml version =“ 1.0” encoding =“ iso-8859-1”?> 0 < numRegElectronico> 261 RU600440756745191124498CFBCFRCTR 16/01/2019 17:44:04 ] for request [userpass N SJT3 850 Bolsa del SESCAM注册中心。 N 39451114L GONZALO DE SANTIAGO PEREZ <达托斯>]

     

错误:''前缀的名称空间'soapenv'尚未声明。'

如您所见,响应返回了预期的结果,但结果无法解析响应。

在SoapUI中运行相同的SOAP请求,结果是正确的。

我曾尝试使用JAXB生成代码,以避免使用webServiceTemplates,但由于WSDL为RPC类型,并且不允许生成方法或Java代码,因此这是不可能的。此选项将被丢弃。

可能是配置错误?如何正确解析响应?

0 个答案:

没有答案