Spring Boot:发生 RESTFul 错误(404、403、500)时获取 JSON 正文

Posted

技术标签:

【中文标题】Spring Boot:发生 RESTFul 错误(404、403、500)时获取 JSON 正文【英文标题】:Spring Boot: Get JSON body when RESTFul error (404, 403, 500) occurs 【发布时间】:2018-02-23 12:25:18 【问题描述】:

我正在创建一个调用 RESTful 端点(通过 GET 方法)的应用程序,如果响应是状态码 200,它会返回一个包含有用数据的 JSON。

这是通过以下行实现的:

ResponseEntity<CorrectResponseObject> response = restTemplate.exchange(requestEntity, CorrectResponseObject.class);

但是,如果我使用 200 以外的状态代码(例如 403、404)点击 URL,则在使用 POSTman 时会检索到不同的 JSON:


    "timestamp": 1505383198800,
    "status": 403,
    "error": "Forbidden",
    "exception": "org.springframework.security.access.AccessDeniedException",
    "message": "Access is denied",
    "path": "/api/test/client/abcd"

但在我的 Java 程序执行以下行之后:

ResponseEntity<CorrectResponseObject> response = restTemplate.exchange(requestEntity, CorrectResponseObject.class);

抛出一个错误:

org.springframework.web.client.HttpClientErrorException: 403 Forbidden
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)

    ...
    ...

...这是完全有效的,但是我希望我的 Java 代码显示,如果我得到一个 403 异常来代替查看 POSTman 显示的 JSON,包括路径、消息时间戳等。

有没有办法做到这一点?

谢谢。

【问题讨论】:

使用 try catch 块,你也可以这样做 即使使用 try 块,如果请求中发生错误,response 也会变为 null。因此,您无法获取包含有用错误信息的 JSON 正文,例如 timestampmessagepath 等。 【参考方案1】:

这样就可以了。

    try 
      ResponseEntity<CorrectResponseObject> response = restTemplate.exchange(requestEntity, CorrectResponseObject.class);
    catch (HttpClientErrorException exception) 
      System.out.println(exception.getStatusCode());
      System.out.println(exception.getResponseBodyAsString())
    

【讨论】:

@pvpkiran 你的答案中的“SOP”是什么? System.out.println

以上是关于Spring Boot:发生 RESTFul 错误(404、403、500)时获取 JSON 正文的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Spring Boot App 访问 RESTful 服务

spring-boot实战04:Spring Boot构建RESTful API

Spring Boot 实现 RESTful

Spring Boot + Spring Security Restful 登录

Spring+Spring Boot+Mybatis框架注解解析

spring boot:使接口返回统一的RESTful格式数据(spring boot 2.3.1)