RestTemplate, включая тело в исключении - PullRequest
0 голосов
/ 10 октября 2019

Предположим, я вызываю веб-сервис с RestTemplate, и он возвращает 500 ошибок состояния с этим телом:

{
"timestamp": "2019-10-10T16:51:15Z",
"status": 500,
"error": "Internal Server Error",
"message": "Error occurred while retrieving entity with id: bb00b45c-9e17-4d75-a89a",
"path": "/api/service"

}

В настоящее время сообщение об исключении RestTemplate выглядит примерно так:

Caused by: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 null
at org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:79)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:124)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)

Есть ли способ включить тело ответа в сообщение об исключении RestTemplate без использования специального обработчика ошибок?

Спасибо!

1 Ответ

1 голос
/ 11 октября 2019

Может быть что-то вроде этого (без специального обработчика ошибок)


ObjectMapper mapper;

try {
    ResponseEntity<User> response = restTemplate.exchange(url,
        HttpMethod.POST, requestEntity, User.class);
} catch (HttpStatusCodeException e) {
    List<String> header = e.getResponseHeaders().get("x-app-err-id");
    String errorMessageId = "";
    if (header != null && !header.isEmpty()) {
        errorMessageId = header.get(0);                
    }
    // You can get the body, but deserialise it using mapper into a POJO
    ErrorResponseBody errorResponseBody = mapper.readValue(e.getResponseBodyAsString(), 
                                          ErrorResponseBody.class);

    // You can re-throw it if you want or use the response body
    throw new CustomException(e, HttpStatus.INTERNAL_SERVER_ERROR);

}
...