2016-06-24 8 views
6

Problem

standardmäßig JAX-WS baut die folgende SOAP-Fehlermeldung, wenn eine abgefangene Ausnahme, die RuntimeException auf meinem Server auftritt erweitert:JAX-WS Federserverseitige benutzerdefinierte Nachricht für Runtime Fehler gesetzt

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope"> 
     <faultcode>S:Server</faultcode> 
     <faultstring>[runtime exception message here]</faultstring> 
     <detail> 
      <ns2:exception class="java.lang.RuntimeException" note="To disable this feature, set com.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace system property to false" xmlns:ns2="http://jax-ws.dev.java.net/"> 
       <message>[runtime exception message here too]</message> 
       <ns2:stackTrace> 
        [stack trace details] 
       </ns2:stackTrace> 
      </ns2:exception> 
     </detail> 
     </S:Fault> 
    </S:Body> 
</S:Envelope> 

Welche Art Sinn machen, außer, dass ich dieses Verhalten, um das ändern möchten, anstatt zu schicken:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope"> 
     <faultcode>S:Server</faultcode> 
     <faultstring>Something wrong happened and it's totally our fault</faultstring> 
     </S:Fault> 
    </S:Body> 
</S:Envelope> 

Beachten Sie, dass die Meldung sollte NICHT der Inhalt der RuntimeException sein, aber eine benutzerdefinierte statische Nachricht für keine Ausnahme, die RuntimeException erstreckt, die serverseitig auftreten kann.

Ich kann die WSDL nicht ändern und ich möchte keine benutzerdefinierte Ausnahme festlegen.

ich die Feder-Plugin bin mit: com.sun.xml.ws.transport.http.servlet.WSSpringServlet

Wie kann ich das tun?

+0

Rechts im 'exception' Tag gibt es ein Attribut' note', das besagt 'Um diese Funktion zu deaktivieren, setzen Sie die Systemeigenschaft com.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace auf' false '. Hast du das versucht? Haben Sie versucht herauszufinden, ob es eine Eigenschaft gibt, die ganze Details zu deaktivieren? –

+0

Ja, und das ist nicht wirklich das, was ich will. –

+0

Ist das nicht ähnlich zu http://stackoverflow.com/questions/31069114/adding-detail-in-a-ws-soapfault-my-custom-exceptionresolver-is-not-used? –

Antwort

0

ich glaube, Sie das Problem mit SoapFaultMappingExceptionResolver nähern können http://docs.spring.io/spring-ws/site/reference/html/server.html

Die SoapFaultMappingExceptionResolver ist ein anspruchsvolleres Umsetzung. Dieser Resolver ermöglicht es Ihnen, den Klassennamen jede Ausnahme zu nehmen, die ausgelöst werden könnten und es zu einer SOAP-Fehler zuzuordnen, wie so:

<beans> 
    <bean id="exceptionResolver" 
     class="org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver"> 
     <property name="defaultFault" value="SERVER"/> 
     <property name="exceptionMappings"> 
      <value> 
       org.springframework.oxm.ValidationFailureException=CLIENT,Invalid request 
      </value> 
     </property> 
    </bean> </beans> 

Die Schlüsselwerte und Standardendpunkt verwenden Sie das Format faultCode, faultString, locale, wobei nur der Fehlercode erforderlich ist. Wenn die Fehlerzeichenfolge nicht gesetzt ist, wird standardmäßig die Ausnahmemeldung angezeigt. Wenn die Sprache nicht festgelegt ist, wird standardmäßig Englisch verwendet. Die obige Konfiguration Ausnahmen von mit einem Fehler Zeichenfolge „Ungültige Anforderung“, Typ ValidationFailureException zu einem clientseitigen SOAP-Fehlern Karte wie in der folgenden Reaktion zu sehen:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
     <SOAP-ENV:Fault> 
      <faultcode>SOAP-ENV:Client</faultcode> 
      <faultstring>Invalid request</faultstring> 
     </SOAP-ENV:Fault> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Wenn ein Wenn eine andere Ausnahme auftritt, wird der Standardfehler zurückgegeben: ein serverseitiger Fehler mit der Ausnahmebedingungsnachricht als Fehlerzeichenfolge.

Sie sollten die org.springframework.oxm.ValidationFailureException Ausnahme von den Ausnahmen ändern, die Sie interessieren dh java.lang.Exception oder java.lang.Runtime

Sie können auch eine benutzerdefinierte Ausnahmeklasse

public class CustomGenericAllException extends RuntimeException { 


    private String errorCode; 
    private String errorMsg; 

    //getter and setter for errorCode and errorMsg  

    public CustomGenericAllException(String errorCode, String errorMsg) { 
     this.errorCode = errorCode; 
     this.errorMsg = errorMsg; 
    } 

} 

in jeder Methode erstellen Sie diese Ausnahme

throw new CustomGenericAllException("S:Server", "Something wrong happened and it's totally our fault"); 

und in der XML-Konfiguration werfen können Sie diese generische Ausnahme <value>com.testpackage.CustomGenericAllException ... abbilden kann.

hoffe, das hilft

+0

Ich habe über SoapFaultMappingExceptionResolver in der Vergangenheit gelesen, aber ich habe Probleme, die richtige Version von Spring WS zu finden (Ich bin auf JDK6 mit Spring 3.1.2 Pakete) –

+0

Kannst du Frühling ws 2.1.4 verwenden? https://github.com/spring-projects/spring-ws –

0

Ich gehe davon aus Sie einen Endpunkt, ähnlich dem unten haben:

import org.springframework.ws.server.endpoint.annotation.Endpoint; 
import org.springframework.ws.server.endpoint.annotation.PayloadRoot; 
import org.springframework.ws.server.endpoint.annotation.RequestPayload; 
import org.springframework.ws.soap.SoapFaultException; 
import org.w3c.dom.Element; 

@Endpoint 
public class HolidayEndpoint { 

    private static final String NAMESPACE_URI = "http://mycompany.com/hr/schemas"; 

    public HolidayEndpoint() { 
    } 

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "HolidayRequest")     
    public void handleHolidayRequest(@RequestPayload Element holidayRequest)    
     throws Exception { 
     //your code to handle the request on the server 
    } 
} 

Nun lassen Sie uns sagen handleHolidayRequest() ist, wo Sie die Runtime geschehen vorwegnehmen, das hätte So ändern Sie den Code:

import org.springframework.ws.server.endpoint.annotation.Endpoint; 
import org.springframework.ws.server.endpoint.annotation.PayloadRoot; 
import org.springframework.ws.server.endpoint.annotation.RequestPayload; 
import org.springframework.ws.soap.SoapFaultException; 
import org.w3c.dom.Element; 

@Endpoint 
public class HolidayEndpoint { 

    private static final String NAMESPACE_URI = "http://mycompany.com/hr/schemas"; 

    public HolidayEndpoint() { 
    } 

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "HolidayRequest")     
    public void handleHolidayRequest(@RequestPayload Element holidayRequest)    
     throws Exception { 
     try 
     { 
      //your code to handle the request on the server 
     } 
     catch(RuntimeException e) 
     { 
      String faultMessage = "Something's wrong on our end. Try again later."; 
      throw new SoapFaultException(faultMessage); 
     } 
    } 
} 

Beachten Sie, wie ich die Laufzeit Ausnahme abfangen und eine neue SoapFaultException werfen? Das funktioniert der Trick und die Antwort ist in etwa so:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <SOAP-ENV:Fault> 
     <faultcode>SOAP-ENV:Server</faultcode> 
     <faultstring xml:lang="en">Something's wrong on our end. Try again later.</faultstring> 
     </SOAP-ENV:Fault> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Nun, wenn Sie so etwas wie feder Integration mit einem Service-Aktivator verwenden, es ist nur das gleiche Konzept mit Ausnahme statt die SOAPFaultException zu werfen, sind Sie gerade gehen

@ServiceActivator(inputChannel = "input", outputChannel = "output") 
public Message<?> handleHolidayRequest(HolidayRequest holidayRequest) { 
    try { 
     // your code to handle the request on the server 
    } catch (RuntimeException e) { 
     String faultMessage = "Something's wrong on our end. Try again later."; 
     SoapFaultException soapFaultException = new SoapFaultException(faultMessage); 
     return MessageBuilder.withPayload(soapFaultException).build(); 
    } 
} 

PS: für Ihr Verständnis, benutzen ich das Web-Service-Tutorial Beispiel von hier zur Veranschaulichung (und ich habe ein funktionierendes Beispiel, wenn Sie noch zu kämpfen haben) eine Nachricht mit dem SOAPFaultException als Nutzlast bauen: http://docs.spring.io/spring-ws/site/reference/html/tutorial.html

Viel Glück!

+0

Mann, ich denke, Sie sind wegen dieses speziellen Satzes Art des Themas off "Thema:" Ich kann die WSDL nicht ändern, und ich will nicht einstellen benutzerdefinierte Ausnahme ". Was ich will ist, um die Standard-Ausnahme zu Seife Fehler Verhalten zu ändern. –

+0

Ok, verstanden. Ich bin froh, dass SoapFaultMappingExceptionResolver für Sie ausgearbeitet hat. – code4kix