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 正文,例如 timestamp
、message
、path
等。
【参考方案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 + Spring Security Restful 登录