2008-09-19 8 views
5

Wie kann ich die von einer SoapFaultClientException gesendeten Fehlerdetails abrufen? ich einen WebServiceTemplate verwenden, wie unten dargestellt:spring & web service client - Fehlerdetail

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? 
} 

Der Web-Service-Störung scheint korrekt gesendet:

<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> 

Willome

Dank

Antwort

0

für das Aus der Javadocs marshalSendAndReceive method sieht es so aus, als würde die SoapFaultClientException im catch-Block niemals passieren.

Aus der API sieht es am besten aus, um die Details des Fehlers zu bestimmen, ist eine benutzerdefinierte Fault Message Receiver festzulegen.

+4

SoapFaultClientException im catch-Block fangen wird passieren. Der Teil, der wie in den Javadocs angegeben wird, ist WebServiceClientException. SoapFaultClientException ist eine Unterklasse dieser Ausnahme. –

0

Problem kommen würde von den JAXB Bibliotheken

6

Ich hatte auch das Problem, dass getFaultDetail() (für einen Sharepoint-Web-Service) null zurückgegeben. Ich kann das Detail Element erhalten, indem ein Verfahren ähnlich wie dies mit:

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); 
} 

Danach können Sie getTextContent() auf dem zurückgegebenen Elemente nennen oder was auch immer Sie wollen.

3

Überprüfen Sie, welche Art von HTTP-Antwort Sie erhalten, wenn Sie Soap Fault erhalten. Ich hatte das gleiche Problem, wenn SOAP Fault-Antworten mit HTTP 200 statt HTTP 500. Dann erhalten Sie:

JAXB Unmarshalling Ausnahme; verschachtelte Ausnahme ist javax.xml.bind.UnmarshalException

Wenn Sie WebServiceTemplate Verbindungsfehler Einstellungen wie unten ändern:

WebServiceTemplate webServiceTemplate = getWebServiceTemplate(); 
webServiceTemplate.setCheckConnectionForFault(false); 

dann können Sie richtig SoapFaultClientException

+0

thx, hat für mich gearbeitet :) – SuperAndrew