2008-09-19 8 views
5

Comment puis-je obtenir les détails de défaut envoyés par une exception SoapFaultClientException? -je utiliser un WebServiceTemplate comme indiqué ci-dessous:client de service web et de printemps - Détail de défaut

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

Le service Web défaut envoyé semble correcte:

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

Merci

Willome

Répondre

0

De l'Javadocs pour la marshalSendAndReceive method il semble que l'exception SoapFaultClientException dans le bloc de capture n'arrivera jamais.

De l'API, il semble que le meilleur pari pour déterminer les détails de la faute est de définir un Fault Message Receiver personnalisé.

+4

SoapFaultClientException dans le bloc catch qui va se passer. La partie throws comme indiqué dans javadocs est WebServiceClientException. SoapFaultClientException est une sous-classe de cette exception. –

0

problème venait des bibliothèques JAXB

6

J'ai eu aussi le problème que getFaultDetail() retourne null (pour un service Web SharePoint). Je pourrais obtenir l'élément de détail en utilisant une méthode similaire à ceci:

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

Après cela, vous pouvez appeler getTextContent() sur l'élément retourné ou tout ce que vous voulez.

3

Vérifiez quel type de réponse HTTP vous obtenez lors de la réception de la faute de savon. J'ai eu le même problème lorsque les réponses SOAP Fault utilisant HTTP 200 au lieu de HTTP 500. Ensuite, vous obtenez:

JAXB unmarshalling exception; exception imbriquée est javax.xml.bind.UnmarshalException

Lorsque vous modifiez les paramètres WebServiceTemplate de défaut de connexion comme ci-dessous:

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

alors vous pouvez attraper correctement SoapFaultClientException

+0

thx, a travaillé pour moi :) – SuperAndrew

Questions connexes