docs - taglib spring jsp
cliente del servicio de primavera y web-Detalle de fallas (4)
Consulte qué tipo de respuesta HTTP obtiene al recibir Soap Fault. Tuve el mismo problema cuando SOAP responde con fallas utilizando HTTP 200 en lugar de HTTP 500. Luego obtienes:
Excepción de clasificación de JAXB; la excepción anidada es javax.xml.bind.UnmarshalException
Cuando cambia la configuración de error de conexión WebServiceTemplate de la siguiente manera:
WebServiceTemplate webServiceTemplate = getWebServiceTemplate();
webServiceTemplate.setCheckConnectionForFault(false);
entonces puedes atrapar adecuadamente SoapFaultClientException
¿Cómo podría obtener el Detalle de la falla enviado por SoapFaultClientException? Uso una WebServiceTemplate como se muestra a continuación:
WebServiceTemplate ws = new WebServiceTemplate();
ws.setMarshaller(client.getMarshaller());
ws.setUnmarshaller(client.getUnMarshaller());
try {
MyResponse resp = (MyResponse) = ws.marshalSendAndReceive(WS_URI, req);
} catch (SoapFaultClientException e) {
SoapFault fault = e.getSoapFault();
SoapFaultDetail details = e.getSoapFault().getFaultDetail();
//details always NULL ? Bug?
}
La falla de servicio web enviada parece correcta:
<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>
<soapenv:Fault>
<faultcode>soapenv:Client</faultcode>
<faultstring>Validation error</faultstring>
<faultactor/>
<detail>
<ws:ValidationError xmlns:ws="http://ws.x.y.com">ERR_UNKNOWN</ws:ValidationError>
</detail>
</soapenv:Fault>
</soapenv:Body>
Gracias
Willome
Desde los Javadocs para el método marshalSendAndReceive , parece que SoapFaultClientException en el bloque catch nunca ocurrirá.
Desde la API, parece que la mejor apuesta para determinar los detalles de la falla es establecer un Receptor de mensajes de falla personalizado.
El problema venía de las Bibliotecas JAXB
También tuve el problema de que getFaultDetail () devolviera un valor nulo (para un servicio web de SharePoint). Podría obtener el elemento de detalle usando un método similar a este:
private Element getDetail(SoapFaultClientException e) throws TransformerException {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMResult result = new DOMResult();
transformer.transform(e.getSoapFault().getSource(), result);
NodeList nl = ((Document)result.getNode()).getElementsByTagName("detail");
return (Element)nl.item(0);
}
Después de eso, puedes llamar a getTextContent () en el Elemento devuelto o lo que quieras.