ОШИБКА WebServiceTemplate: «Пространство имен для префикса soapenv не было объявлено - PullRequest
0 голосов
/ 22 января 2019

У меня ОШИБКА: 'Пространство имен для префикса' soapenv 'не объявлено.' в ответе на вызов веб-службы.

Это wsdlчто я использую, вы можете увидеть это на этом Суть

И мой код такой:

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 Registrode Solicitud Bolsa del SESCAM. N N39451114LGONZALODE SANTIAGOПЕРЕЗ 0 ]

17: 44: 01,936 ОТЛАДКА получена: 675 - Получен ответ [RegistrarEntradaReturn 0 261 RU600440756745191124498CFBCFRCTR 16/01/2019 17: 44: 04 ] по запросу [userpass N SJT3 850 Registro de Solicitud Bolsa del SESCAM. N N39451114LGONZALODE SANTIAGOПЕРЕЗ 0 ]

ОШИБКА: '' Пространство имен для префикса 'soapenv' не было объявлено. '

Как вы можетесм. ответ возвращает ожидаемый результат, но результат не может проанализировать ответ.

При выполнении того же запроса SOAP в SoapUI результат верный.

Я попытался сгенерировать кодс JAXB, чтобы избежать использования webServiceTemplates, но это было невозможно, потому что WSDL имеет тип RPC и не позволяет генерировать методы или код Java.Эта опция отбрасывается.

Может ли это быть ошибкой конфигурации?Как правильно разобрать ответ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...