我正在尝试使用以下代码发送SOAP请求:
String strXML = new RegistroUnico().formarXML(unidad, codSIACI, solicitud, "entrada", usuario, pass);
StreamSource source = new StreamSource(new StringReader(strXML));
StreamResult result = new StreamResult(writer);
webServiceTemplate.setDefaultUri(direccion);
//Enviamos y recibimos
webServiceTemplate.sendSourceAndReceiveToResult(direccion, source, result);
StringBuffer sb = ((StringWriter) writer).getBuffer();
String finalstring = sb.toString();
这是the formarXML(unidad, codSIACI, solicitud, "entrada", usuario, pass)
函数:
private static final String CABECERA_ENTRADA = "<ws:RegistrarEntrada xmlns:ws=\"http://ws.rtaws.aapp.jccm.es\"> \n"
+ " <sUsuario>%s</sUsuario> \n"
+ " <sClave>%s</sClave> \n"
+ " <strXML> \n" + " <![CDATA[\n";
private static final String PIE_ENTRADA = "\n]]> \n" + " </strXML> \n"
+ " </ws:RegistrarEntrada>";
private static final String CABECERA_SALIDA = "<ws:RegistrarSalida xmlns:ws=\"http://ws.rtaws.aapp.jccm.es\"> \n"
+ " <sUsuario>%s</sUsuario> \n"
+ " <sClave>%s</sClave> \n"
+ " <strXML> \n" + " <![CDATA[\n";
private static final String PIE_SALIDA = "\n]]> \n" + " </strXML> \n"
+ " </ws:RegistrarSalida>";
public RegistroUnico() {
}
public String formarXML(String unidad, String codigo, SolicitudRegistro unaSolicitud, String tipoRegistro, String usuario, String pass) throws Exception {
String xmlString = "";
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
DOMImplementation implementation = builder.getDOMImplementation();
Document doc = implementation.createDocument(null, "xml", null);
// Creamos el primer elemento (etiqueta) del XML
Element Datos = doc.createElement("Datos");
// Unimos el elemento a la raiz del documento
doc.getDocumentElement().appendChild(Datos);
// Creamos los 6 primeros nodos
Element AcuseRecibo = doc.createElement("AcuseRecibo");
// solo para las salidas
Element CodRegEnt = doc.createElement("CodRegEnt");
Element EjercicioRegEnt = doc.createElement("EjercicioRegEnt");
Element CodUniOrgOrig = doc.createElement("CodUniOrgOrig");
//
Element CodSIACI = doc.createElement("CodSIACI");
Element CodUniOrgDest = doc.createElement("CodUniOrgDest");
Element Observaciones = doc.createElement("Observaciones");
Element ExisteRep = doc.createElement("ExisteRep");
Element Interesado = doc.createElement("Interesado");
// Creamos los valores que van dentro de los 6 primeros nodos
Text textAcuseRecibo = doc.createTextNode("N");
// solo para las salidas
Text textCodRegEnt = doc.createTextNode("");// doc.createTextNode(unaSolicitud.getNumeroRegistro());
Text textEjercicioRegEnt=doc.createTextNode("");
Text textCodUniOrgOrig = doc.createTextNode(unidad);
Text textCodSIACI = doc.createTextNode(codigo);
Text textCodUniOrgDest = doc.createTextNode(unidad);
Text textObservaciones = doc.createTextNode(unaSolicitud.getObservaciones());
Text textExisteRep = doc.createTextNode("N");
// a�adimos los 6 primeros nodos
Datos.appendChild(AcuseRecibo);
if (tipoRegistro.equals("salida")) {
Datos.appendChild(CodRegEnt);
Datos.appendChild(EjercicioRegEnt);
}
Datos.appendChild(CodSIACI);
if (tipoRegistro.equals("salida")) {
Datos.appendChild(CodUniOrgOrig);
} else {
Datos.appendChild(CodUniOrgDest);
}
Datos.appendChild(Observaciones);
Datos.appendChild(ExisteRep);
Datos.appendChild(Interesado);
// a�aadimos los valores de los 6 primeros nodos
AcuseRecibo.appendChild(textAcuseRecibo);
if (tipoRegistro.equals("salida")) {
CodRegEnt.appendChild(textCodRegEnt);
EjercicioRegEnt.appendChild(textEjercicioRegEnt);
}
CodSIACI.appendChild(textCodSIACI);
if (tipoRegistro.equals("salida")) {
CodUniOrgOrig.appendChild(textCodUniOrgOrig);
} else {
CodUniOrgDest.appendChild(textCodUniOrgDest);
}
Observaciones.appendChild(textObservaciones);
ExisteRep.appendChild(textExisteRep);
// Creamos los elementos que van dentro de interesado
Element TipoDoc = doc.createElement("Int_TipoDoc");
Element NifCif = doc.createElement("Int_NifCif");
Element Nombre = doc.createElement("Int_Nombre");
Element PrimerAp = doc.createElement("Int_PrimerAp");
Element SegundoAp = doc.createElement("Int_SegundoAp");
// valores de las variables
String tipoDoc = unaSolicitud.getInteresado().getTipoDoc();
String numIdentificador = "";
//Issue #11672
numIdentificador = unaSolicitud.getInteresado().getNifCif();
String apellido1 = unaSolicitud.getInteresado().getPrimerAp();
if (apellido1.length() > 30) {
apellido1 = apellido1.substring(0, 29);
}
String apellido2 = unaSolicitud.getInteresado().getSegundoAp();
if(apellido2!=null){
if (apellido2.length() > 30) {
apellido2 = apellido2.substring(0, 29);
}
}else{
apellido2 ="";
}
// Creamos los valores que van dentro de interesado
Text textTipoDoc = doc.createTextNode(tipoDoc);
Text textNifCif = doc.createTextNode(numIdentificador);
Text textNombre = doc.createTextNode(unaSolicitud.getInteresado()
.getNombre());
Text textPrimerAp = doc.createTextNode(apellido1);
Text textSegundoAp = doc.createTextNode(apellido2);
Interesado.appendChild(TipoDoc);
Interesado.appendChild(NifCif);
Interesado.appendChild(Nombre);
Interesado.appendChild(PrimerAp);
Interesado.appendChild(SegundoAp);
TipoDoc.appendChild(textTipoDoc);
NifCif.appendChild(textNifCif);
Nombre.appendChild(textNombre);
PrimerAp.appendChild(textPrimerAp);
SegundoAp.appendChild(textSegundoAp);
// a�adimos el �ltimo valor
Element NumDocumentos = doc.createElement("NumDocumentos");
Text textNumDocumentos = doc.createTextNode("0");
Datos.appendChild(NumDocumentos);
NumDocumentos.appendChild(textNumDocumentos);
// cargamos el xml en una variable de tipo string
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
xmlString = result.getWriter().toString();
// Quitamos Etiquetas XML
xmlString = xmlString.substring(54);
xmlString = xmlString.replace("<xml>", "");
xmlString = xmlString.replace("</xml>", "");
xmlString = xmlString.trim();
// A�adimos cabeceras-Acci�n
if (tipoRegistro.equals("salida")) {
String cabecera = String.format(CABECERA_SALIDA, usuario, pass);
xmlString = cabecera + xmlString + PIE_SALIDA;
}
else{
String cabecera = String.format(CABECERA_ENTRADA, usuario, pass);
xmlString = cabecera + xmlString + PIE_ENTRADA;
}
} catch (Exception e) {
System.err.println("Error en el almacenamiento del XML: "
+ e.getMessage());
}
return xmlString;
}
当代码到达webServiceTemplate.sendSourceAndReceiveToResult(direccion, source, result);
时,我会在日志中得到此信息:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Header/><env:Body><ws:RegistrarEntrada xmlns:ws="http://ws.rtaws.aapp.jccm.es">
<sUsuario>user</sUsuario>
<sClave>pass</sClave>
<strXML>
<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>111111112</Int_NifCif>
<Int_Nombre>GONZALO</Int_Nombre>
<Int_PrimerAp>DE SANTIAGO</Int_PrimerAp>
<Int_SegundoAp>PEREZ</Int_SegundoAp>
</Interesado>
<NumDocumentos>0</NumDocumentos>
</Datos>
</strXML>
</ws:RegistrarEntrada></env:Body></env:Envelope>]
00:34:57,408 DEBUG received:706 - Received response [<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:RegistrarEntradaResponse xmlns:ns1="http://ws.rtaws.aapp.jccm.es" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><RegistrarEntradaReturn xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="soapenc:string"><?xml version="1.0" encoding="iso-8859-1"?><RTA-JCCM><resultado>0</resultado><numRegElectronico>20640</numRegElectronico><cve>RU0476988435451213036CFRBGRFRCPR</cve><fecha>21/12/2018 00:34:56</fecha></RTA-JCCM></RegistrarEntradaReturn></ns1:RegistrarEntradaResponse></soapenv:Body></soapenv:Envelope>] for request [<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Header/><env:Body><ws:RegistrarEntrada xmlns:ws="http://ws.rtaws.aapp.jccm.es">
<sUsuario>user</sUsuario>
<sClave>pass</sClave>
<strXML>
<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>111111112</Int_NifCif>
<Int_Nombre>GONZALO</Int_Nombre>
<Int_PrimerAp>DE SANTIAGO</Int_PrimerAp>
<Int_SegundoAp>PEREZ</Int_SegundoAp>
</Interesado>
<NumDocumentos>0</NumDocumentos>
</Datos>
</strXML>
</ws:RegistrarEntrada></env:Body></env:Envelope>]
错误:前缀'soapenv'的名称空间尚未声明。'
我已经在SoapUI中测试了请求,结果还可以,所以我想错误应该出在Java代码中,也许在文档创建中? 有人可以帮我吗?