我遇到错误:“未声明前缀'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("<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 注册请求布尔萨德尔SESCAM。 Int_PrimerAp> PEREZ 0 17:44:01,936收到的调试信息:675-收到的响应[RegistrarEntradaReturn <?xml version =“ 1.0” encoding =“ iso-8859-1”?>
] for request [userpass 0 < numRegElectronico> 261RU600440756745191124498CFBCFRCTR 16/01/2019 17:44:04 N SJT3 850 Bolsa del SESCAM注册中心。 N 39451114L GONZALO DE SANTIAGO PEREZ <达托斯>]错误:''前缀的名称空间'soapenv'尚未声明。'
如您所见,响应返回了预期的结果,但结果无法解析响应。
在SoapUI中运行相同的SOAP请求,结果是正确的。
我曾尝试使用JAXB生成代码,以避免使用webServiceTemplates,但由于WSDL为RPC类型,并且不允许生成方法或Java代码,因此这是不可能的。此选项将被丢弃。
可能是配置错误?如何正确解析响应?