使用RestTemplate过程中, 如果接口返回的不是200状态,则会抛出异常报错。但在实际接口对接中,可能希望获取接口返回的异常信息做返回。因此可以自定义RestTemplate异常的处理:
相关博客参考链接:https://blog.csdn.net/qq_24210767/article/details/78992374
实现方式:
创建一个自己的ExceptionHandler类,实现ResponseErrorHandler接口,代码:
package com.walletServer.config;
import java.io.IOException;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.client.ResponseErrorHandler;
public class ThrowErrorHandler implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
// 返回false表示不管response的status是多少都返回没有错
// 这里可以自己定义那些status code你认为是可以抛Error
return false;
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
// 这里面可以实现你自己遇到了Error进行合理的处理
}
}
在Application配置里面定义RestTemplate时,指定异常 控制器为此控制器:
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
RestTemplate restTemplate=new RestTemplate(factory);
//Response status code 4XX or 5XX to the client.
restTemplate.setErrorHandler(new ThrowErrorHandler());
return restTemplate;
}
然后使用RestTemplate时,可以根据返回状态做判断:
/**
* 请求Tos节点服务
* @param reqVO
* @return
*/
private JSONObject requestTos(JSONObject reqVO, String getAuthorization) {
// Authorization传递
headers.add(HttpHeaders.AUTHORIZATION, getAuthorization);
HttpEntity<Object> entity = new HttpEntity<>(reqVO, headers);
log.info("------------------TosUtils.requestTos() -start, url=" + baseUrl + ", param=" + reqVO);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(baseUrl, entity, String.class);
log.info("------------------TosUtils.requestTos() -end, result=" + responseEntity);
if (!responseEntity.getStatusCode().is2xxSuccessful()) {
log.info("------------------TosUtils.requestTos() -errorBody: {}", responseEntity.getBody());
throw new RestClientException(responseEntity.getBody());
}
JSONObject resultJson = JSON.parseObject(responseEntity.getBody());
return resultJson;
}