RestTemplate ConnectException无法访问

时间:2017-11-01 10:09:36

标签: rest spring-boot resttemplate request-mapping

我不明白这一点......我试图抓住java.net.ConnectException以防下游API离线。然而,Eclipse警告我它无法访问 - 建议代码不能抛出ConnectException。但是,它显然可以。

@RequestMapping("/product/{id}")
public JsonNode getProduct(@PathVariable("id") int productID, HttpServletResponse oHTTPResponse)
{
    RestTemplate oRESTTemplate = new RestTemplate();
    ObjectMapper oObjMapper = new ObjectMapper();

    JsonNode oResponseRoot = oObjMapper.createObjectNode();

    try
    {
        ResponseEntity<String> oHTTPResponseEntity = oRESTTemplate.getForEntity("http://localhost:9000/product/"+productID, String.class);
    }
    catch (ConnectException e)
    {
        System.out.println("ConnectException caught. Downstream dependency is offline");
    }
    catch (Exception e)
    {
        System.out.println("Other Exception caught: " + e.getMessage());
    }
}

捕获的异常是:

Other Exception caught: I/O error on GET request for "http://localhost:9000/product/9": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect

如果找不到productID,我的下游会返回404,如果下游离线,则明确返回ConnectException。我想要做的就是将相关的状态代码传回浏览器。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

捕获ResourceAccessException。它将ConnectException隐藏在RestTemplate中。

答案 1 :(得分:0)

RestTemplate类的内部方法链处理所有IOException(这是ConnectException的超类),并引发新的ResourceAccessException,因此,RestTemplate方法只能捕获ResourceAccessException类型或其层次结构树的异常。