使用RestTemplate,我正在查询远程 API 以返回预期类型(如果 HTTP 2xx)或 APIError(如果 HTTP 4xx / 5xx)的对象。
因为响应对象是不确定的,我实现了一个自定义ResponseErrorHandler并覆盖handleError(ClientHttpResponse clientHttpResponse),以便在它发生时提取 APIError。到现在为止还挺好:
@Component
public class RemoteAPI {
public UserOrders getUserOrders(User user) {
addAuthorizationHeader(httpHeaders, user.getAccessToken());
HttpEntity<TokenRequest> request = new HttpEntity<>(HEADERS);
return restTemplate.postForObject(CUSTOMER_ORDERS_URI, request, UserOrders.class);
}
private class APIResponseErrorHandler implements ResponseErrorHandler {
@Override
public void handleError(ClientHttpResponse response) {
try {
APIError apiError = new ObjectMapper().readValue(response.getBody(), APIError.class);
} catch ...
}
}
private void refreshAccessToken(User user) {
addAuthorizationHeader(httpHeaders, user.getAccessSecret());
HttpEntity<TokenRequest> request = new HttpEntity<>(HEADERS);
user.setAccessToken(restTemplate.postForObject(TOKEN_REFRESH_URI, request, AccessToken.class));
}
}
挑战在于getUserOrders(),或类似的 API 调用,偶尔会因“可恢复”错误而失败;例如,API 访问令牌可能已过期。然后我们应该refreshAccessToken()在重新尝试之前进行 API 调用getUserOrders()。诸如此类的可恢复错误应该对用户隐藏,直到相同的错误发生多次,此时它们被认为是不可恢复的/严重的。
任何“关键”错误(例如:第二次失败、完全验证失败或传输层失败)都应报告给用户,因为没有可用的自动恢复。
管理错误处理逻辑的最优雅和最健壮的方法是什么,记住要返回的对象类型直到运行时才知道?
绝地无双
相关分类