2015-09-30 11 views
7

Sto costruendo un'applicazione utilizzando Spring Boot. Questa applicazione è distribuita, il che significa che ho più API che si chiamano a vicenda.Spring Boot come ignorare HttpStatus Exceptions

Uno dei servizi sottostanti interagisce con un database e risponde con i dati richiesti. Se viene effettuata una richiesta di un ID inesistente, ho risposta con un 404 httpStatus

return new ResponseEntity<>(HttpStatus.NOT_FOUND); 

(Stessa cosa con 400 errore su alcune operazioni, o 204 per la cancellazione di una voce, ecc).

Il problema è che ho alcune altre applicazioni Spring Boot che chiamano queste API, generano un'eccezione org.springframework.web.client.HttpClientErrorException: 404 Not Found quando richiedono, in questo esempio, una voce inesistente. Ma il codice di stato 404 è inteso e non dovrebbe restituire questa eccezione (facendo in modo che il mio interruttore di circuito Hystrix chiami la sua funzione di fallback).

Come posso risolvere questo problema?

La chiamata al servizio è implementato come questo nel mio codice: ResponseEntity<Object> data = restTemplate.getForEntity(url, Object.class);

mio RestTemplate è impostato in questo modo:

private RestTemplate restTemplate = new RestTemplate(); 
+0

Come si imposta il 'RestTemplate'? –

+0

@SotiriosDelimanolis Ho aggiornato la domanda con il modo in cui ho configurato il mio RestTemplate – Kaj

risposta

10

Primavera RestTemplate utilizza un ResponseErrorHandler per gestire gli errori nelle risposte. Questa interfaccia fornisce sia un modo per determinare se la risposta ha un errore (ResponseErrorHandler#hasError(ClientHttpResponse)) e come gestirlo (ResponseErrorHandler#handleError(ClientHttpResponse)).

È possibile impostare s' ResponseErrorHandler con RestTemplate#setErrorHandler(ResponseErrorHandler) cui javadoc stati

Per impostazione predefinita il RestTemplate, RestTemplate utilizza un DefaultResponseErrorHandler.

Questa impostazione predefinita implementazione

[...] i controlli per il codice di stato sul ClientHttpResponse: tutto il codice con la serie HttpStatus.Series.CLIENT_ERROR o HttpStatus.Series.SERVER_ERROR è considerato un errore. Questo comportamento può essere modificato ignorando il metodo hasError(HttpStatus).

In caso di errore, si genera l'eccezione che si sta vedendo.

Se si desidera modificare questo comportamento, è possibile fornire la propria implementazione ResponseErrorHandler (probabilmente ignorando DefaultResponseErrorHandler) che non considera 4xx come errore o che non genera un'eccezione.

Per esempio

restTemplate.setErrorHandler(new ResponseErrorHandler() { 
    @Override 
    public boolean hasError(ClientHttpResponse response) throws IOException { 
     return false; // or whatever you consider an error 
    } 

    @Override 
    public void handleError(ClientHttpResponse response) throws IOException { 
     // do nothing, or something 
    } 
}); 

È possibile quindi controllare il codice di stato della ResponseEntity restituito da getForEntity e gestire da soli.

+0

. Funziona senza problemi, grazie mille. Non lo sapevo. – Kaj

+0

Questo non sembra funzionare quando si utilizza Spring Cloud 1.0.2 o SR3. Il gestore degli errori non viene mai chiamato e l'eccezione viene lanciata a prescindere. – RubesMN

+0

@RubesMN Non conosco Spring Cloud. Ti consiglio di fare una nuova domanda con tutti i dettagli rilevanti per riprodurre il comportamento che stai vedendo. –