springboot中restTemplate请求异常处理

springboot中restTemplate请求异常处理

问题解决办法

在使用默认配置的RestTemplate请求时,如果接口失败会执行抛出异常,而无法获取到错误编码和信息。
解决办法: 可以在初始化时添加自定义错误处理类,这样在请求时遇到请求异常,就会返回正常的错误对象。

@SpringBootApplication
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

    @Bean
    public RestTemplate getRestTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        //设置restTemplate的默认异常处理器为自定义的处理器
        restTemplate.setErrorHandler(new CustomErrorHandler());
        //修改restTemplate默认编码格式为UTF-8
        List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
        for (int i = 0; i < messageConverters.size(); i++) {
            HttpMessageConverter<?> messageConverter = messageConverters.get(i);
            if (messageConverter.getClass().equals(StringHttpMessageConverter.class)) {
                messageConverters.set(i, new StringHttpMessageConverter(StandardCharsets.UTF_8));
            }
        }
        return restTemplate;
    }
}

注:CustomErrorHandler为异常处理实现类

public class CustomErrorHandler implements ResponseErrorHandler {

    Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 表示 response 是否存在任何错误。实现类通常会检查 response 的 HttpStatus。
     *
     * @param response
     * @return
     * @throws IOException
     */
    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        int rawStatusCode = response.getRawStatusCode();
        HttpStatus statusCode = HttpStatus.resolve(rawStatusCode);
        return (statusCode != null ? statusCode.isError() : hasError(rawStatusCode));
    }

    protected boolean hasError(int unknownStatusCode) {
        HttpStatus.Series series = HttpStatus.Series.resolve(unknownStatusCode);
        return (series == HttpStatus.Series.CLIENT_ERROR || series == HttpStatus.Series.SERVER_ERROR);
    }

    /**
     * 处理 response 中的错误, 当 hasError 返回 true 时才调用此方法。
     * 当返回异常信息时自己想要做的一些操作处理
     *
     * @param response
     * @throws IOException
     */
    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
    }

    /**
     * 覆盖了上面的方法
     * 处理 response 中的错误, 当 hasError 返回 true 时才调用此方法。
     * 当返回异常信息时自己想要做的一些操作处理
     *
     * @param url
     * @param method
     * @param response
     * @throws IOException
     */
    @Override
    public void handleError(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
        logger.error("=======================ERROR============================");
        logger.error("HOST:{},URI:{}", url.getHost(), url.getPath());
        logger.error("Method Type:{}", method.name());
        logger.error("Exception:{}", response.getStatusCode());
        logger.error("========================================================");
    }
}
上一篇:【无标题】


下一篇:HttpStatus状态