【发布时间】:2019-03-19 21:28:07
【问题描述】:
我调用后端服务来取回 PersonResponse 对象:
PersonResponse response = restTemplate.postForObject(url, request, PersonResponse.class);
PersonResponse 类包含一个“状态”字段,用于指示是否从后端成功检索到一个人的信息:
public class PersonResponse {
private String name;
private String address;
private ResponseStatus status;
......
}
public class ResponseStatus {
private String errorCode;
private String errorMessage;
......
}
因此,当成功检索到响应时(http 200),我能够返回 PersonResponse 类型的响应。但是,当出现错误(400 或 500)时,后端仍然会返回一个 PersonResponse,但只有“状态”字段填充了错误信息,这就是后端向我返回响应的方式:
backend code:
PersonResponse errResp = .....; // set the status field with error info
return new ResponseEntity<PersonResponse>(errResp, HttpStatus.INTERNAL_SERVER_ERROR);
但是我在下面的调用返回了一个空响应,尽管它应该给了我一个带有错误信息的 PersonResponse。谁能告诉我这是为什么?
try {
PersonResponse response = restTemplate.postForObject(url, request, PersonResponse.class);
} catch (HttpStatusCodeException se) {
log.debug(se.getResponseBodyAsString());
// I was able to see the error information stored in PersonResponse in the log
}
return response; // always null when 500 error is thrown by the backend
【问题讨论】:
-
一个方法不能在返回的同时抛出异常。如果它抛出一个异常,那么它不会返回任何东西。返回一个 PersonResponse,包含一个人的所有字段,虽然你根本没有人,只是一个错误,但这种设计真的很糟糕。不要那样做。请注意,您发布的最后一个 sn-p 代码可能无法编译。
-
感谢您的评论,但我无法控制后端代码。另外,我知道一个方法不能同时返回一些东西并抛出异常,但是当参数之一是 HTTP 状态代码(例如 500)时 ResponseEntity 构造函数如何工作
标签: java spring-boot http httpresponse resttemplate