Как я могу получить данные из ответа после того, как RestTemplate сгенерирует RestClientException, потому что он не может его проанализировать - PullRequest
0 голосов
/ 20 марта 2019

Использование restTemplate.exchange(uri, method, entity, responseType) для вызова REST завершается неудачно с RestClientException, если ответ неправильный responseType. Например.,

org.springframework.web.client.RestClientException: Error while extracting response for type [java.util.List<java.lang.Byte>] and content type [application/json;charset=UTF-8];
nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Numeric value (281759) out of range of Java byte

Поскольку это не RestClientResponseException, у нас, похоже, нет доступа к данным ответа, таким как код состояния и тело (даже в необработанном виде). ​​

Есть ли способ получить (необработанные) данные из исходного (не разбираемого) ответа? (для регистрации)

Ответы [ 2 ]

0 голосов
/ 22 марта 2019
 final RestTemplate restTemplate = new RestTemplate();
        try { 
            restTemplate.exchange(uri, method, entity, responseType);
        } catch (RestClientException e) {
            //for logging exact message
            restTemplate.getForObject("https://httpbin.org/ip", String.class); 

        }
0 голосов
/ 20 марта 2019

Попробуйте разобрать ответ как String.См. этот ответ - аналогичная концепция может использоваться с методом exchange.

РЕДАКТИРОВАТЬ: Если исключение не происходит всегда, и вы все еще хотите бытьв состоянии легко отобразить правильные ответы, вы можете переопределить соответствующий MessageConverter (который фактически вызывает исключение) и впоследствии сделать все, что захотите, потому что конвертер дает вам необработанный HttpInputMessage.

Предполагается, что вы используете MappingJackson2HttpMessageConverter.как это (но не проверено) :

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
    return new MappingJackson2HttpMessageConverter(objectMapper) {
        @Override
        public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
            try {
                return super.read(type, contextClass, inputMessage);
            } catch (HttpMessageNotReadableException e) {
                // LOG here...
                throw e;
            }
        }
    };
}
...