Как получить сообщение или определенный тип исключения, работающий с RestTemplate и обработчиками исключений в приложении Spring Boot

У меня есть @RestController с методом:

@PostMapping
    public ResponseEntity doSmth(@RequestBody String json){
            ...
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            RestTemplate restTemplate = new RestTemplate();
            String url = "...";
            HttpEntity<String> requestEntity = new HttpEntity<>("body", headers);
            restTemplate.postForLocation(url, requestEntity);
            ....
    }

Приложение я звоню работает следующим образом:
1. Возвращает ответсущность.
2. Если что-то пошло не так, то это выдает исключение.

Когда он выдает исключение, благодаря обработчик исключений он дает json в качестве ответа с информацией о проблеме.

Например, обработчик исключения для SomeException:

@RestController
@ControllerAdvice
public class SomeExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(SomeException.class)
    public final ResponseEntity<ErrorDetails> handleUserNotFoundException(SomeException ex, WebRequest request) {
        final HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
        ErrorDetails errorDetails = new ErrorDetails(new Date(), status.value(), status.getReasonPhrase(), ex.getMessage(),
                request.getDescription(false));
        return new ResponseEntity<>(errorDetails, status);

ErrorDetails - просто POJO. Это необходимо для предоставления клиентам информации об исключении.

Когда приложение, которое я вызываю с помощью restTemplate, выдает исключение,
Я получаю Ошибка HttpServerError.

System.out.println(error); //org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 null

ПРОБЛЕМА:
Мне нужно знать, какое исключение было выбрано на другом сервере или с каким сообщением, но он дает такой ответ для любого исключения с любыми сообщениями.

ОБНОВИТЬ:
Почтальон на сервер:
1. Метод @PostMapping возвращает ResponseEntity с пустым телом и заголовком location (операция создания), поэтому клиент получает код состояния 201 CREATED и местоположение.
2. Если что-то пошло не так, клиент получает json, что обозначается ErrorDetails.
Сервер к серверу:
1. ResponseEntity responseEntity = restTemplate.postForObject(url,requestEntity, ResponseEntity.class); Работает, но даже когда пытаюсь использовать responseEntity.getHeaders() - не содержит localtion.
2. Когда сервер бросает SomeException extends RuntimeException со своим обработчиком - зависит от кода состояния, у меня есть исключение (HttpServerError for 5xx).

Когда я использую postForUrl, я получаю location, но, за исключением случаев, ситуация такая же.

я не понимаю проблемы

Michael 27.02.2019 15:18

Когда что-то пошло не так, мне нужно знать, что именно. На другом сервере могут быть разные исключения с разными сообщениями, на основном сервере ответ всегда HttpServerError. Мне нужно различать различные типы исключений после ответа restTemplate

Donatello 27.02.2019 15:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
208
0

Другие вопросы по теме