2015-06-03 12 views
7

Ho un semplice client utilizzando RESTEasy come segue:RESTEasy Exception Handling client

public class Test { 
    public static void main(String[] args) { 
     ResteasyClient client = new ResteasyClientBuilder().build(); 
     ResteasyWebTarget target = client.target("http://localhost"); 
     client.register(new MyMapper()); 
     MyProxy proxy = target.proxy(MyProxy.class); 
     String r = proxy.getTest(); 
    } 
} 

public interface MyProxy { 
    @GET 
    @Path("test") 
    String getTest(); 
} 

@Provider 
public class MyMapper implements ClientExceptionMapper<BadRequestException>{ 

    @Override 
    public RuntimeException toException(BadRequestException arg0) { 
     // TODO Auto-generated method stub 
     System.out.println("mapped a bad request exception"); 
     return null; 
    } 

} 

Il server è configurato per restituire un 400 - Bad Request su http://localhost/test insieme a un messaggio utile. Un BadRequestException viene lanciato da ClientProxy. A parte il wrapping in try/catch, come posso rendere getTest() catturare l'eccezione e restituire il messaggio utile della risposta come una stringa. Ho provato varie implementazioni di ClientExceptionMapper, ma sembra che riesca a farlo bene. Il codice precedente non chiama mai toException. Cosa mi manca qui?

La mia soluzione attuale consiste nell'utilizzare un ClientResponseFilter e quindi fare un setStatus(200) e inserire lo stato originale nell'entità di risposta. In questo modo evito i lanci delle eccezioni.

+0

Puoi spiegare cosa intendi con "Il server è configurato per restituire 400 - Richiesta non valida"? Il mio pensiero è che l'implementazione di 'MyProxy.getTest()' dovrebbe effettivamente generare un'eccezione che contiene un messaggio utile. Quindi dovresti utilizzare un ExceptionMapper per mappare quell'eccezione a una risposta 400 - Richiesta non valida (e potresti includere il messaggio come corpo della risposta). – FGreg

+1

Leggi la prima frase della mia domanda. Sto scrivendo un client, non il server. – gogators

risposta

-1

Suggerirei di passare attraverso l'API client Jax-RS a meno che non vi sia una funzionalità necessaria per utilizzare i client RestEasy. (navi RESTEasy con JAX-RS, quindi non c'è alcuna differenza di biblioteca)

Client client = ClientFactory.newClient(); 
WebTarget target = client.target("http://localhost/test"); 
Response response = target.request().get(); 
if (response.getStatusCode() != Response.Status.OK.getStatusCode()) { 
    System.out.println(response.readEntity(String.class)); 
    return null; 
} 
String value = response.readEntity(String.class); 
response.close(); 

Il motivo per cui il mapper non funziona è perché il client non è in realtà gettando l'eccezione. Il client restituisce un risultato valido al proxy e il proxy lo sta leggendo e genera l'eccezione, che avviene dopo che il programma di analisi può intercettarlo.

+0

Questo non risolve tutti i vantaggi dell'uso del proxy (ad esempio/test è hardcoded nell'esempio sopra)? Ho letto la domanda su come ottenere il proxy per lanciare un'eccezione più utile. È strano per me che il proxy restituisca un'eccezione con un messaggio hard-coded di "cattiva richiesta" quando il messaggio effettivo è nella risposta. Esiste un intercettore per aggirare la gestione delle eccezioni del proxy? –