如何使用Spring RestTemplate客户端读取HTTP 500

时间:2018-04-12 13:40:52

标签: spring-mvc spring-boot resttemplate

一个简单的Spring Boot REST控制器

@PostMapping(path = "check-and-submit", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<MyOutput> checkAndSave(@RequestBody @Valid MyInput input, Errors errors){
    ResponseEntity<MyOutput> result = null;
    if (errors.hasErrors()) {
        result = new ResponseEntity<>(MyOutput.buildErrorResponse(errors), HttpStatus.INTERNAL_SERVER_ERROR);
    } else {
        myDao.save(input.buildEntity());
        result = new ResponseEntity<>(MyOutput.buildSuccessResponse(), HttpStatus.OK);      
    }
    return result;
}

它的测试类

public static void main(String[] args) {    
    MyInput dto = new MyInput();
    // set properties
    RestTemplate restTemplate = new RestTemplate();
    MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
    headers.add("Content-Type", "application/json");
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
    HttpEntity<MyInput> request = new HttpEntity<MyInput>(dto, headers);
    try {
        ResponseEntity<MyOutput> result = restTemplate.postForEntity(URL, request, MyOutput.class);
        System.out.println(result);
    } catch(Exception e) {
        e.printStackTrace();
    }
}

对于成功案例,这很好。但是,对于例外情况,即HTTP 500,这将失败

org.springframework.web.client.HttpServerErrorException: 500 null
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:97)

正如其中一篇文章中所建议的,我创建了一个可以成功读取响应的错误处理程序

public class TestHandler extends DefaultResponseErrorHandler {

    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        Scanner scanner = new Scanner(response.getBody());
        String data = "";
        while (scanner.hasNext())
            data += scanner.next();
        System.out.println(data);
        scanner.close();
    }
}

但即使在HTTP 500的情况下,我怎样才能让RestTemplate读取和反序列化响应JSON。

在任何其他人类问题标记机器人将此标记为重复之前,这里有一个简单的解释,说明这与其他人有什么不同。

所有其他问题都解决了如何处理HTTP 500,最多读取响应体。这个问题是针对是否可以将响应反序列化为JSON。这种功能在诸如JBoss RESTEasy之类的框架中得到了很好的建立。检查Spring中可以实现的相同效果。

1 个答案:

答案 0 :(得分:1)

这应该有效。

try {
      ResponseEntity<MyOutput> result = restTemplate.postForEntity(URL, request, MyOutput.class);
     } catch(HttpServerErrorException errorException) {
           String responseBody = errorException.getResponseBodyAsString();
           // You can use this string to create MyOutput pojo using ObjectMapper.
     }