我正在使用RestTemplate從我的代碼中呼叫外部 API,如下所示:
try {
responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity,
UploadResonse.class);
} catch (BusinessException ex) {
fetchErrorResponseEntity = ex.getResponseEntity();
if (fetchErrorResponseEntity.getStatusCodeValue() == 404) {
throw new BusinessException(ex.getMessage(), ErrorResponse.NOT_FOUND);
} else if (fetchErrorResponseEntity.getStatusCodeValue() == 500) {
throw new BusinessException(ex.getMessage(),
ErrorResponse.INTERNAL_SERVER_ERROR);
} else if (fetchErrorResponseEntity.getStatusCodeValue() == 400) {
throw new BusinessException(ex.getMessage(), ErrorResponse.INVALID_REQUEST);
}
}
此 API 呼叫回傳200 Success但是當我除錯它時,它仍然轉到RestTemplate.class 的handleResponse(URI url, HttpMethod method, ClientHttpResponse response )方法
然后它來到我的 RestTemplateErrorHandler.java 檔案
@Override
public boolean hasError(ClientHttpResponse clientHttpResponse)
throws IOException {
return clientHttpResponse.getStatusCode() != HttpStatus.OK;
}
@Override
public void handleError(ClientHttpResponse clientHttpResponse)
throws IOException {
String errMessage = getErrMessage(clientHttpResponse);
HttpStatus status = clientHttpResponse.getStatusCode();
switch (status) {
case BAD_REQUEST: // 400
throw new BusinessException(errMessage,
ErrorResponse.INVALID_REQUEST);
case NOT_FOUND:
throw new BusinessException(errMessage, ErrorResponse.NOT_FOUND);
case SERVICE_UNAVAILABLE: // 503
throw new BusinessException(errMessage, ErrorResponse.TIME_OUT);
case METHOD_NOT_ALLOWED: // 405
case INTERNAL_SERVER_ERROR: // 500
default:
throw new BusinessException(errMessage,
ErrorResponse.INTERNAL_SERVER_ERROR);
}
}
有人可以租借幫助我了解這是否是正確的行為。我懷疑如果回應是200 Success它不應該轉到RestTemplate.class和RestTemplateErrorHandler.class當 API 回傳201 Created狀態時, 這種行為會產生問題,那時它會轉到handleError()方法并回傳默認情況INTERNAL_SERVER_ERROR 可以有人請在這里幫助我
uj5u.com熱心網友回復:
以下代碼將在每次回應不是200 OK時呼叫錯誤處理程式,如果成功則為201 Created事件。
@Override
public boolean hasError(ClientHttpResponse clientHttpResponse)
throws IOException {
return clientHttpResponse.getStatusCode() != HttpStatus.OK;
}
嘗試將實作更改為以下內容:
@Override
public boolean hasError(ClientHttpResponse clientHttpResponse)
throws IOException {
return !clientHttpResponse.getStatusCode().is2xxSuccessful();
}
這更適合您的需求,因為它將所有2xx狀態視為成功請求,而不僅僅是200 OK。
uj5u.com熱心網友回復:
根據檔案方法handleResponse(),顧名思義,它將處理給定的回應,執行適當的日志記錄并呼叫ResponseErrorHandlerRestTemplate 使用的介面(如果需要),以確定特定回應是否有錯誤。
RestTemplateErrorHandler類實作實作ResponseErrorHandler。
如果hasError()方法回傳true,那么 Spring 將自動呼叫該handleError()方法。這就是流量。
如果您檢查handleResponse下面給出的方法的實作,您將看到有一個hasError方法呼叫來檢查回應是否有任何錯誤。方法的默認實作hasError將回傳 true 是回應代碼是4XX或5XX。如果沒有錯誤,方法將繼續執行,并且不會呼叫 handleError 方法,正如我上面解釋的那樣。
protected void handleResponse(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
ResponseErrorHandler errorHandler = this.getErrorHandler();
boolean hasError = errorHandler.hasError(response);
if (this.logger.isDebugEnabled()) {
try {
this.logger.debug(method.name() " request for \"" url "\" resulted in " response.getRawStatusCode() " (" response.getStatusText() ")" (hasError ? "; invoking error handler" : ""));
} catch (IOException var7) {
;
}
}
if (hasError) {
errorHandler.handleError(url, method, response);
}
}
在您發布hasError的代碼中,對于所有不同于200. 這handleError就是呼叫的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494830.html
上一篇:BigQuery:基于另一個陣列生成和分解帶有例外的陣列
下一篇:例外時不要繼續
