- Spring RestTemplate : переопределение ResponseErrorHandler не работает при установке в классе конфигурации
- 2 ответа
- Похожие вопросы:
- Spring Cloud 1.0.2 и SR3 RestTemplate игнорируют мой ResponseErrorHandler
- 2 ответа
- Обработка ошибок пружинной пластины
- 1. Обзор
- 2. Обработка Ошибок по умолчанию
- 3. Реализация ResponseErrorHandler
- 4. Тестирование Нашей Реализации
- 5. Заключение
- Implementing the ResponseErrorHandler Interface
- 3 Answers 3
- Spring RestTemplate : Overridding ResponseErrorHandler not working when set in Configuration class
- 2 Answers 2
Spring RestTemplate : переопределение ResponseErrorHandler не работает при установке в классе конфигурации
У меня есть RestTemplate, где я переопределяю ResponseErrorHandler, как в приведенном ниже коде
и мой класс ResponseError выглядит так
Если l автоматически подключает RestTemplate и вызывает службу rest и генерируется ошибка, то ResponseError не работает. Но если я не установлю обработчик ошибок в конфигурации и не установлю его после автоматического подключения класса RestTemplate, как показано ниже, он будет работать.
Почему это restTemplate.setErrorHandler(new RsponseError()); не работает при установке в классе конфигурации?. Заранее спасибо за вашу помощь.
2 ответа
Используя RestTemplate , я запрашиваю удаленный API, чтобы вернуть объект либо ожидаемого типа (если HTTP 2xx), либо APIError (если HTTP 4xx / 5xx). Поскольку объект ответа является неопределенным, я реализовал пользовательский ResponseErrorHandler и переопределил handleError(ClientHttpResponse.
Я использую SpringBoot с RestTemplate для связи с другим приложением. Однако я не могу изменить его API, и эта внешняя служба всегда возвращает код возврата 200OK . По умолчанию у нас есть ResponseErrorHandler , который реагирует на все коды ответов 4xx и 5xx , но в моем случае, когда есть.
Вы можете использовать @ControllerAdvice , чтобы все ваши проблемы исчезли!
Вот короткий пример, который должен решить вашу проблему. Он принимает выходные данные из вашей проверки бобов и отображает их как JSON.
Вы можете взглянуть на один из моих предыдущих ответов. Здесь будут рассмотрены некоторые детали того, как это работает. Проверка бобов в DropWizard с пользовательским выводом Json
Я считаю, что ErrorHandler вашего Бина RestTemplate устанавливается из других мест после того, как генерируется бин RestTemplate, так что вам придется принудительно переопределить ErrorHandler при вызове resttemplate.
Пожалуйста, проверьте все места автоматического подключения RestTemplate и посмотрите, вызывается ли restTemplate. setErrorHandler().
Похожие вопросы:
Я вызываю службу ReST через RestTemplate и пытаюсь переопределить ResponseErrorHandler в Spring 3.2 для обработки пользовательских кодов ошибок. CustomResponseErrroHandler public class.
Используя Spring Cloud, я не могу устранить выброшенные исключения, используя пользовательский ResponseErrorHandler на моем RestTemplate, используя последние версии. Год назад мы реализовали нечто.
есть ли способ добавить конвертер сообщений http в RestTemplate в Spring Boot по конфигурации? Я хотел бы просто добавить новое преобразованное сообщение и не удалять существующие. Это приведет к.
Используя RestTemplate , я запрашиваю удаленный API, чтобы вернуть объект либо ожидаемого типа (если HTTP 2xx), либо APIError (если HTTP 4xx / 5xx). Поскольку объект ответа является неопределенным.
Я использую SpringBoot с RestTemplate для связи с другим приложением. Однако я не могу изменить его API, и эта внешняя служба всегда возвращает код возврата 200OK . По умолчанию у нас есть.
Я использую приложение spring cloud: Spring Boot с конфигурацией ленты Eureka + по умолчанию. Я использую 2 конфигурации RestTemplate , обе в настоящее время являются @LoadBalanced , и обе они имеют.
Я пытаюсь проверить своего клиента spring rest, но у меня возникли проблемы. Вот мой клиентский класс: @Component public class MyClient< private RestTemplate restTemplate; @Autowired public.
У меня есть API, который выбрасывает ResponseStatusException в случае ошибки : throw new ResponseStatusException(HttpStatus.NOT_FOUND, My error msg); На стороне клиента у меня есть : RestTemplate.
Я использую Spring’s RestTemplate , чтобы сделать некоторые API звонков в стороннюю службу. Все работает так, как ожидалось, когда ответ возвращается в виде 200 SUCCESS . Однако, когда ответом.
Я пытаюсь переопределить интерфейс ResponseErrorHandler, чтобы иметь возможность вернуть весь запрос (код состояния, тело и т. д.) В случае любого ответа, отличного от 2xx. Я заметил, что значение.
Источник
Spring Cloud 1.0.2 и SR3 RestTemplate игнорируют мой ResponseErrorHandler
Используя Spring Cloud, я не могу устранить возникшие исключения с помощью настраиваемого ResponseErrorHandler в моем RestTemplate с использованием последних выпусков. Год назад мы реализовали нечто похожее на Как игнорировать исключения HttpStatus . Это работало, пока мы не портировали на Spring boot / cloud 1.0.2 и выше. Установка точек останова в этих обработчиках при возникновении тайм-аутов или проблем с подключением не запускается в режиме отладки при использовании Spring Cloud 1.0.2 или SR3.
И, наконец, когда мы вызываем, используя тот же restTemplate (я подтвердил, что ErrorHandler был установлен на ExceptionLessErrorHandler)
Генерируется исключение, инициированное java.net.SocketTimeoutException: connect timed out . Это не было поведением до нашего порта (мы использовали Spring 3.2.4) ранее.
Обновить. Чтобы быть конкретным о выпуске spring-cloud-starter-parent
Я не пробовал другие выпуски spring-cloud-starter-parent , кроме этих двух.
2 ответа
Если исключение является результатом проблемы с подключением, ResponseErrorHandler не будет вызываться, поскольку он используется только для проблем с ответом. Единственный способ предотвратить возникновение исключения при проблемах с подключением, о котором я знаю, — это добавить какой-то прокси-сервер localhost через HttpConnectionFactory.
Вот что мне нужно было сделать для поезда выпуска Angel:
Angel.X создает RestTemplate , и вы получали автоматически созданный, а не тот, который вы создали.
Я также создал проблему, чтобы сделать это более удобным для пользователя. и задокументировать, как это сделать.
Источник
Обработка ошибок пружинной пластины
Узнайте, как обрабатывать ошибки с помощью RestTemplate Spring
Автор: baeldung
Дата записи
1. Обзор
В этом коротком руководстве мы обсудим, как реализовать и внедрить интерфейс ResponseErrorHandler в экземпляр RestTemplate – для изящной обработки ошибок HTTP, возвращаемых удаленными API.
2. Обработка Ошибок по умолчанию
По умолчанию RestTemplate выдаст одно из этих исключений в случае ошибки HTTP:
- HttpClientErrorException – в случае HTTP – статуса 4xx
- Исключение HttpServerErrorException – в случае состояния HTTP 5xx
- UnknownHttpStatusCodeException – в случае неизвестного состояния HTTP
Все эти исключения являются расширениями RestClient Response Exception .
Очевидно, что самая простая стратегия добавления пользовательской обработки ошибок-это обернуть вызов в блок try/catch . Затем мы обрабатываем пойманное исключение так, как считаем нужным.
Однако эта простая стратегия плохо масштабируется по мере увеличения числа удаленных API или вызовов. Было бы более эффективно, если бы мы могли реализовать многоразовый обработчик ошибок для всех наших удаленных вызовов.
3. Реализация ResponseErrorHandler
Итак, класс, реализующий ResponseErrorHandler , будет считывать состояние HTTP из ответа и либо:
- Создайте исключение, которое имеет значение для нашего приложения
- Просто игнорируйте состояние HTTP и позвольте потоку ответов продолжаться без перерыва
Нам нужно внедрить реализацию ResponseErrorHandler в экземпляр RestTemplate .
Следовательно, мы используем Rest TemplateBuilder для создания шаблона и замены DefaultResponseErrorHandler в потоке ответов.
Итак, давайте сначала реализуем наш RestTemplate ResponseErrorHandler:
Затем мы создаем экземпляр RestTemplate с помощью Rest TemplateBuilder, чтобы представить наш RestTemplateResponseErrorHandler :
4. Тестирование Нашей Реализации
Наконец, давайте проверим этот обработчик, издеваясь над сервером и возвращая состояние NOT_FOUND :
5. Заключение
В этой статье представлено решение для реализации и тестирования пользовательского обработчика ошибок для RestTemplate , который преобразует ошибки HTTP в значимые исключения.
Как всегда, код, представленный в этой статье, доступен на Github .
Источник
Implementing the ResponseErrorHandler Interface
I’m trying to override the ResponseErrorHandler interface to be able to return the entire request (status code, body etc.) in case of any response other than 2xx.
I noticed that the Spring (RestTemplate) default returns an exception in case of a response other than 2xx. I do not want to return an exception, I just want to be able to return a:
Following some tutorials, I’ve found the following code:
But I have not understood how I can return a ResponseEntity without changing the method return (which I can not by implementing the method).
3 Answers 3
You can use Spring’s ControllerAdvice and ExceptionHandler annotations to handle exceptions through your application. Below code returns 500 http status code if any exception encountered in your request. You can add other Exception classes or your own custom class to handle specific cases and return specific status codes to client.
Edit
Handling each code will not be a good idea. Rather you can wrap them in your custom exception and provide proper message to your client service. Still you can try something like below.
Then handle the codes from in your rest template as below. Here you won’t be able to return body of the response to the client.
You can do this:
This you generify all status code that should drop an exception, and it will return in the body.
There are two extensively used and very convenient exception handlers which are provided by Spring framework for centralized exception management in Spring Boot applications.
ResponseEntityExceptionHandler : exception thrown by our endpoint methods(methods annotated with @RequestMapping )
A convenient base class for @ControllerAdvice classes that wish to provide centralized exception handling across all @RequestMapping methods through @ExceptionHandler methods.
ResponseErrorHandler : Spring provides a hook ResponseErrorHandler which can be implemented to handle the exception thrown by external services. To call any external service most likely you will be using a RestTemplate . A RestTemplate can throw three types of exception as listed below :
To simplify things we can handle these exceptions as a catch block separately but it lead to lot of boilerplate code scattered across our service. Strategy interface used by the RestTemplate to determine whether a particular response has an error or not.
There are two steps to using ResponseErrorHandler :
Step 1: Create a custom error handler class by implementing ResponseErrorHandler and implements its methods hasError and handleError
Step 2: We need to inject the ResponseErrorHandler implementation into the RestTemplate instance as follows :
Источник
Spring RestTemplate : Overridding ResponseErrorHandler not working when set in Configuration class
I have the RestTemplate where l am overridding the ResponseErrorHandler like in the code below
and my ResponseError class is like this
If l autowire the RestTemplate and invoke a rest service and an error is generated the ResponseError does not work. But if l do not set the error handler in the Configuration and set it after autowiring the RestTemplate like below class it will work.
Why is it that restTemplate.setErrorHandler(new RsponseError()); is not working when set in configuration class?. Thanks for you help in advance.
2 Answers 2
You can use @ControllerAdvice to make all your problems disappear!
Here is a short example, which should solves your issue. It take the output from your bean validation and display it as JSON.
You can take a look at one of my previous answers. This will cover some of the details how this works. Bean validation in DropWizard with custom Json output
I believe the ErrorHandler of your RestTemplate bean is set from other places after RestTemplate bean is generated so that you have to override the ErrorHandler forcely when calling the resttemplate.
Please check all the places autowiring the RestTemplate and see if restTemplate. setErrorHandler() is called.
Источник