У меня ОШИБКА: 'Пространство имен для префикса' 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("<Datos><AcuseRecibo>N</AcuseRecibo><CodSIACI>SJT3</CodSIACI><CodUniOrgDest>850</CodUniOrgDest><Observaciones>Registro de Solicitud Bolsa del SESCAM.</Observaciones><ExisteRep>N</ExisteRep><Interesado><Int_TipoDoc>N</Int_TipoDoc><Int_NifCif>39451114L</Int_NifCif><Int_Nombre>GONZALO</Int_Nombre><Int_PrimerAp>DE SANTIAGO</Int_PrimerAp><Int_SegundoAp>PEREZ</Int_SegundoAp></Interesado><NumDocumentos>0</NumDocumentos></Datos>");
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.Эта опция отбрасывается.
Может ли это быть ошибкой конфигурации?Как правильно разобрать ответ?