2012-04-08 10 views
7

Sto cercando di gestire gli errori provenienti dal mio back-end. Il handleMessage() viene chiamato se si verifica un errore ma il contenuto è un'istanza di XmlMessage. Vorrei cambiarlo alla mia risposta - basta impostare il codice di risposta e aggiungere un messaggio.Gestione degli errori con gli intercettori CXF - modifica del messaggio di risposta

non ho trovato alcuna documentazione adeguata, che potrebbe dirmi come fare questo ...

Questi axamples sono per il riposo, ma mi piacerebbe gestire questa cosa in SOAP troppo.

intercettore

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> 

risposta

5

E qui è the other piece of your puzzle. Stai già utilizzando JAX-RS, quindi perché non utilizzare anche JAX-WS?

This thread e this blog post mappatura copertina Eccezioni negli errori SOAP. Breve e dolce:

La specifica JAX-WS 2.0 richiede che l'eccezione annotati con @WebFault deve avere due costruttori e un metodo [getter per ottenere le informazioni di guasto]:

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

Il WrapperException è sostituito dal nome dell'eccezione e FaultBean è sostituito dal nome della classe che implementa il bean di errore. Il bean di errore è un bean Java che contiene le informazioni dell'errore e viene utilizzato dal client del servizio Web per conoscere la causa dell'errore.

E c'è la tua mappatura. Basta specificare le implementazioni delle firme sopra nel contesto di @WebFault e la tua API SOAP dovrebbe mapparle felicemente. Ovviamente, i link contengono maggiori dettagli.

+0

Grazie. Non accetto ancora la tua risposta per dividere la reputazione tra di voi due – user219882

+0

@Tomas Mentre lo sforzo è nobile (sono contento di aver aiutato!), Che, purtroppo, [non è come funziona il sistema di taglie] (http://meta.stackexchange.com/questions/2786/accept-multiple-answers-or-split-bounty-among-several-users) ([dettagli] (http://meta.stackexchange.com/questions/16065/come-fa-il-bounty-sistema-lavoro/16067 # 16067)). Sono a disagio nel conciliare questo per te perché ho una partecipazione nel risultato, ma esiste l'opzione per concedere un premio aggiuntivo se ritieni che due risposte lo meritino. Scusa per il disturbo; Non ho scritto il sistema. :) – MrGomez

+0

Oh, è un peccato. Ho deciso di fare questo: conferisco la generosità a mjwenk perché la reputazione lo aiuta più di te e accetta la tua risposta dato che hai link sia a REST che a SOAP. Immagino sia l'unico modo giusto (o almeno un po '). Grazie per averlo detto ... – user219882

13

Se stai usando JAX-RS, perché non messa a punto un'eccezione mapper, e quindi utilizzare tale mapper per gestire il risposta.

Un semplice esempio:

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

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

} 

allora si avrebbe bisogno per registrare il provider nelle jaxrs servire aggiungendo:

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

nella configurazione del server nel contesto. Con questo hai pieno accesso all'eccezione e puoi ottenere quello che vuoi da esso.

+0

E se mi piacerebbe usare SOAP? Come posso gestirlo? Come per JAX-RS o devo intercettatore? – user219882

+0

Per il sapone, penso che devi usare un intercettore. Non sono mai stato in grado di capire esattamente cosa dovevo fare per andare a lavorare nelle cose di sapone di CXF. Fortunatamente per me non era un gran problema, ma il modo in cui jax-rs sembra molto più bello. – mjwenk

+0

Cosa succede se ho uno scenario seguente. Ho un intercettore che esegue la convalida. E ho anche un gestore di eccezioni. Se voglio lanciare la mia eccezione personalizzata dall'intercettore, verrà richiamato il metodo toResponse del mio gestore di eccezioni? – Bhuvan