form docs spring service webservicetemplate

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



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.