2012-04-08 8 views
7

Ich versuche, Fehler aus meinem Backend zu behandeln. Die handleMessage() wird aufgerufen, wenn ein Fehler auftritt, aber der Inhalt ist eine Instanz von XmlMessage. Ich möchte es zu meiner eigenen Antwort ändern - einfach den Antwortcode einstellen und eine Nachricht hinzufügen.Fehlerbehandlung mit CXF-Interceptors - Ändern der Antwortnachricht

Ich habe keine ordnungsgemäße Dokumentation gefunden, die mir sagen, wie dies zu tun ...

Diese axamples sind für REST, aber ich möchte auch diese Sache in SOAP verwalten.

Interceptor

public class ErrorHandlerInterceptor extends AbstractPhaseInterceptor<Message> { 

    public ErrorHandlerInterceptor() { 
     super(Phase.POST_LOGICAL); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 
     Response response = Response 
      .status(Response.Status.BAD_REQUEST) 
      .entity("HOW TO GET A MESSAGE FROM AN EXCEPTION IN HERE???") 
      .build(); 
     message.getExchange().put(Response.class, response); 
    } 

} 

context.xml

<bean id="errorHandlerInterceptor" 
    class="cz.cvut.fit.wst.server.interceptor.ErrorHandlerInterceptor" /> 

<jaxrs:server address="/rest/"> 
    <jaxrs:serviceBeans> 
     <ref bean="restService" /> 
    </jaxrs:serviceBeans> 
    <jaxrs:outFaultInterceptors> 
     <ref bean="errorHandlerInterceptor" /> 
    </jaxrs:outFaultInterceptors> 
</jaxrs:server> 

Antwort

5

Und hier ist the other piece of your puzzle. Sie verwenden bereits JAX-RS, also warum nicht auch JAX-WS verwenden?

This thread und this blog post Abdeckung Zuordnung Ausnahmen in SOAP-Fehler. Kurz und bündig:

Die JAX-WS 2.0-Spezifikation verlangt, dass die Ausnahme mit @WebFault kommentierte müssen zwei Konstrukteure haben und ein Verfahren [Getter die Fehlerinformationen zu erhalten]:

WrapperException(String message, FaultBean faultInfo) 
WrapperException(String message, FaultBean faultInfo, Throwable cause) 
FaultBean getFaultInfo() 

Die WrapperException wird ersetzt durch den Namen der Ausnahme und FaultBean wird durch den Klassennamen ersetzt, der die Fault Bean implementiert. Die Fehler-Bean ist eine Java-Bean, die die Informationen des Fehlers enthält und vom Web-Service-Client verwendet wird, um die Ursache für den Fehler zu ermitteln.

Und da ist Ihr Mapping. Geben Sie einfach Implementierungen der oben genannten Signaturen im Kontext von @WebFault an und Ihre SOAP-API sollte diese glücklich zuordnen. Offensichtlich enthalten die Links mehr Details.

+0

Danke. Ich akzeptiere deine Antwort noch nicht, um den Ruf zwischen euch beiden zu teilen – user219882

+0

@Tomas Während die Anstrengung edel ist (ich bin froh, dass ich geholfen habe!), Das, leider, [funktioniert nicht das Kopfgeldsystem] (http://meta.stackexchange.com/questions/2786/accept-multiple-answers-or-split-bounty-among-several-users) ([details] (http://meta.stackexchange.com/questions/16065)/how-does-the-bounty-System-Arbeit/16067 # 16067)). Es ist mir unbehaglich, dies für Sie in Einklang zu bringen, weil ich am Ergebnis beteiligt bin, aber es besteht die Möglichkeit, ein zusätzliches Kopfgeld zu gewähren, wenn Sie zwei Antworten dafür verdienen. Entschuldigen Sie die Umstände; Ich habe das System nicht geschrieben. :) – MrGomez

+0

Oh, das ist schade. Ich entschied mich, dies zu tun: Ich gebe mjwenk das Kopfgeld, weil der Ruf ihm mehr hilft als du und akzeptiere deine Antwort, da du Links zu REST und SOAP hast. Ich denke, es ist der einzige faire Weg (oder zumindest ein bisschen). Danke für das Erwähnen ... – user219882

13

Wenn Sie JAX-RS verwenden, warum nicht Setup eine Ausnahme Mapper, und dann diese Mapper verwenden die zu handhaben Antwort.

Ein einfaches Beispiel:

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class MyExceptionMapper implements 
     ExceptionMapper<MyException> { 

    @Override 
    public Response toResponse(MyException e) { 
     return Response.status(Status.NOT_FOUND).build(); 
    } 

} 

Dann müßten Sie die Anbieter in den jaxrs durch Zugabe dienen registrieren:

<jaxrs:providers> 
    <bean class="com.blah.blah.blah.blah.MyExceptionMapper"/> 
</jaxrs:providers> 

in der Server-Konfiguration in Zusammenhang. Damit haben Sie vollen Zugriff auf die Ausnahme und können von dort alles bekommen, was Sie wollen.

+0

Und was, wenn ich SOAP verwenden möchte? Wie kann ich damit umgehen? Wie für die JAX-RS oder muss ich dich abfangen? – user219882

+0

Für Seife, ich denke, Sie müssen einen Interzeptor verwenden. Ich war nie in der Lage, genau herauszufinden, was ich tun musste, um in CXFs Seifenkram arbeiten zu können. Zum Glück für mich war es kein großes Problem, aber der Jax-Rs-Weg scheint viel schöner zu sein. – mjwenk

+0

Was ist, wenn ich ein folgendes Szenario habe. Ich habe einen Interceptor, der die Validierung durchführt. Und ich habe auch einen Ausnahme-Handler. Wenn ich meine benutzerdefinierte Ausnahme vom Interceptor werfen möchte, wird die toResponse-Methode des Exception-Handlers aufgerufen? – Bhuvan