2013-11-20 7 views
8

Unser System Umgang mit JAX-WS Client-Stubs mit auf Service WSDL generiert basiert. Im Fehlerfall-Server gibt SOAP-Fehler wie folgt aus:Wie SOAP-Fehler des faultcode erhalten, wenn verbraucht benutzerdefinierte Fehlerausnahme SOAP Web Service

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header /> 
    <s:Body> 
    <s:Fault> 
     <faultcode>SomeErrorCode</faultcode> 
     <faultstring xml:lang="en-US">Some error message</faultstring> 
     <detail> 
     <ApiFault xmlns="http://somenamespace.com/v1.0" xmlns:a="http://somenamespace.com/v1.0" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <a:RequestId>123456789</a:RequestId> 
      <a:CanRetry>true</a:CanRetry> 
     </ApiFault> 
     </detail> 
    </s:Fault> 
    </s:Body> 

Basierend auf WSDL SomeCustomFault Ausnahmeklasse erzeugt und alle Service-Methoden deklariert werden, dies zu werfen (siehe unten) Ausnahme.

@WebFault(name = "ApiFault", targetNamespace = "http://services.altasoft.ge/orders/v1.0") 
public class SomeCustomFault 
    extends Exception 
{ 
    private ApiFault faultInfo; 

    public SomeCustomFault(String message, ApiFault faultInfo) { 
     super(message); 
     this.faultInfo = faultInfo; 
    } 

    public SomeCustomFault(String message, ApiFault faultInfo, Throwable cause) { 
     super(message, cause); 
     this.faultInfo = faultInfo; 
    } 

    public ApiFault getFaultInfo() { 
     return faultInfo; 
    } 
} 

Wie Sie diese benutzerdefinierte Fehlerausnahme sehen sich Exception und nicht SOAPFaultException. Ich brauche den Fehlercode der SOAP-Fehler, der nur von SOAPFaultException mit getFaultCode Methode abgerufen werden konnte. Können Sie mir sagen, wie kann ich erreichen SOAPFaultException oder SOAP-Fehler-Fehlercode an der Stelle, wo ich oben genannten benutzerdefinierten Fehler Ausnahme fangen?

+0

haben Sie nicht Zugriff auf die zurückgegebene SOAPMessage als solche? –

+0

Nein. Ich habe nur eine Ausnahme ausgelöst, die in meinem Code gefangen ist – Nikoloz

Antwort

9

Sie können ein JAX-WS handler implementieren und es zu Ihrer Client-Webdienst-Referenz hinzufügen. Dies wird Gelegenheit gegeben, die Anforderungsnachricht und die Antwortnachricht zu behandeln ODER über einen Fehler benachrichtigt zu werden.

Erstellen Sie eine SOAPHandler<SOAPMessageContext> und Ihre handleFault() Methode wird die SOAPMessageContext übergeben werden. Von dass man getMessage().getSOAPBody().getFault() zum SOAPFault zu bekommen, die getFaultCode() und getDetail() enthält.

Ihre neue Fehler-Handler, um Ihre Web-Service ref zuordnen. Ein Weg ist über @HandlerChain. Es wird vor Ihrer catch Klausel aufgerufen.

Verwandte Themen