在`RestTemplate`抛出`RestClientException`之后,如何从响应中获取数据,因为它无法解析它

时间:2019-03-20 10:28:29

标签: spring exception response resttemplate

当响应错误的restTemplate.exchange(uri, method, entity, responseType)时,使用RestClientException进行REST调用失败,并返回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,因此我们似乎无法访问状态码和正文之类的响应数据(甚至不是原始格式)。

是否有办法从原始(无法分析的)响应中获取(原始)数据? (用于记录)

3 个答案:

答案 0 :(得分:0)

尝试将响应解析为String。请参见this answer-类似的概念可以与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;
            }
        }
    };
}

答案 1 :(得分:0)

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

        }

答案 2 :(得分:0)

尝试在 RestTemplate 的 messageConverters 中添加 StringHttpMessageConverter

StringHttpMessageConverter stringHttpMessageConverter
            = new StringHttpMessageConverter(StandardCharsets.UTF_8);
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter
            = new MappingJackson2HttpMessageConverter(objectMapper);

RestTemplate restTemplate = new RestTemplate(factory);
restTemplate.setMessageConverters(
            List.of(stringHttpMessageConverter, jackson2HttpMessageConverter));