我不明白这一点......我试图抓住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
。我想要做的就是将相关的状态代码传回浏览器。
我该怎么做?
答案 0 :(得分:2)
捕获ResourceAccessException
。它将ConnectException
隐藏在RestTemplate
中。
答案 1 :(得分:0)
RestTemplate类的内部方法链处理所有IOException(这是ConnectException的超类),并引发新的ResourceAccessException,因此,RestTemplate方法只能捕获ResourceAccessException类型或其层次结构树的异常。