当响应错误的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
,因此我们似乎无法访问状态码和正文之类的响应数据(甚至不是原始格式)。
是否有办法从原始(无法分析的)响应中获取(原始)数据? (用于记录)
答案 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));