【问题标题】:How to catch time out exception when use RestTemplate call API使用 RestTemplate 调用 API 时如何捕获超时异常
【发布时间】:2019-05-06 03:01:19
【问题描述】:

我有函数调用 api,使用 RestTemplate。我想在超时返回 null 时捕获异常,这是我的代码:

//Create resttemplate
public List<String> getRoleUser(String username) {
    try{
        RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
        String[] list = restTemplate.getForObject("(link call api)", String[].class);
        return Arrays.asList(list);
    }catch (Exception ex){
        ex.printStackTrace();
        return null;
    }
}

//Override timeouts in request factory
private SimpleClientHttpRequestFactory getClientHttpRequestFactory()
{
    SimpleClientHttpRequestFactory clientHttpRequestFactory
                      = new SimpleClientHttpRequestFactory();
    //Connect timeout
    clientHttpRequestFactory.setConnectTimeout(10_000);

    //Read timeout
    clientHttpRequestFactory.setReadTimeout(10_000);
    return clientHttpRequestFactory;
}

但它不起作用。 那么,如何在超时时返回 null 呢?

【问题讨论】:

  • but it don't work. 是什么意思?你有什么错误信息吗?
  • 它不起作用这意味着不返回null。
  • 如果超时,如何捕获异常,并在函数 getRoleUser() 中返回 null?
  • 我正在尝试出现消息错误,但没有返回 null org.springframework.web.client.ResourceAccessException: I/O error on GET request for "link call api": connect timed out; nested exception is java.net.SocketTimeoutException: connect timed out

标签: java spring-boot resttemplate


【解决方案1】:

你应该捕获一个 HttpStatusCodeException 异常:

try {
    restTemplate.exchange(...);
} catch (HttpStatusCodeException exception) {
    int statusCode = exception.getStatusCode().value();
    ...
}

【讨论】:

    【解决方案2】:

    我解决了这个问题。调用 API 后,我再次检查 RestTemplate 的返回值。这段代码:

    public List<String> getRoleUser(String username) {
            try {
                RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
                String[] list = restTemplate.getForObject("link call api",
                        String[].class);
                if (list.length > 0) {
                    return Arrays.asList(list);
                }
                return null;
            } catch (Exception exception) {
                return null;
            }
        }
    

    【讨论】:

    • 捕获所有异常是一个糟糕的设计。捕获返回 null 的异常同样糟糕。
    猜你喜欢
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多