2015-09-30 2 views
7

Я создаю приложение, используя Spring Boot. Это приложение распространяется, что означает, что у меня есть несколько API, которые называют друг друга.Spring Boot как игнорировать исключения HttpStatus

Одна из моих базовых служб взаимодействует с базой данных и отвечает запрошенными данными. Если запрос на unexisting ID сделана, я ответ с 404 HttpStatus:

return new ResponseEntity<>(HttpStatus.NOT_FOUND); 

(То же самое с 400 ошибки на некоторых операций, или 204 для удаления записи и т.д.).

Проблема в том, что у меня есть другие приложения Spring Boot, которые вызывают эти API, бросают org.springframework.web.client.HttpClientErrorException: 404 Not Found Исключение, если в этом примере они запрашивают неиспользуемую запись. Но код статуса 404 предназначен и не должен возвращать это исключение (заставляя мой выключатель Hystrix вызывать его резервную функцию).

Как я могу решить эту проблему?

Вызов службы осуществляется как это в моем коде: ResponseEntity<Object> data = restTemplate.getForEntity(url, Object.class);

Мой RestTemplate настроен так:

private RestTemplate restTemplate = new RestTemplate(); 
+0

Как вы настраиваете 'RestTemplate'? –

+0

@SotiriosDelimanolis Я обновил вопрос, как настроить свой RestTemplate – Kaj

ответ

10

весны RestTemplate использует ResponseErrorHandler для обработки ошибок в ответах. Этот интерфейс обеспечивает как способ определения, имеет ли ответ ошибку (ResponseErrorHandler#hasError(ClientHttpResponse)), так и как ее обрабатывать (ResponseErrorHandler#handleError(ClientHttpResponse)).

Вы можете установить RestTemplate «s ResponseErrorHandler с RestTemplate#setErrorHandler(ResponseErrorHandler), чьи Javadoc состояния

По умолчанию RestTemplateDefaultResponseErrorHandler использует.

Это по умолчанию реализации

[...] проверяет код состояния на ClientHttpResponse: любой код с серией HttpStatus.Series.CLIENT_ERROR или HttpStatus.Series.SERVER_ERROR является считается ошибкой. Такое поведение можно изменить, переопределив метод hasError(HttpStatus).

В случае ошибки, это вызывает исключение, которое вы видите.

Если вы хотите изменить это поведение, вы можете предоставить свою собственную реализацию ResponseErrorHandler (возможно, переопределив DefaultResponseErrorHandler), которая не считает ошибку 4xx ошибкой или не генерирует исключение.

Например

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 
    } 
}); 

Вы можете проверить код состояния ResponseEntity возвращенного getForEntity и справиться с ней самостоятельно.

+0

Работает плавно, спасибо большое. Я не знал об этом. – Kaj

+0

Это не работает при использовании Spring Cloud 1.0.2 или SR3. Обработчик ошибок никогда не вызывается, и исключение создается независимо. – RubesMN

+0

@RubesMN Я не знаю Весеннее облако. Я рекомендую вам задать новый вопрос со всеми необходимыми сведениями для воспроизведения поведения, которое вы видите. –

Смежные вопросы