我试图用javax.ws.rs.ext.ExceptionMapper
类捕获WebApplicationException
,但我得到一个奇怪的行为。如何使用JAX-RS捕获WebApplicationException
这是我简单的REST方法:
@GET
@Path("/saySomething")
public List<String> saySomething() {
String response = EchoRestClient.ping();
List<String> list = new ArrayList<>();
list.add(response);
list.add("okay");
return list;
}
(1)这是调用另一个REST API客户端类:
public class EchoRestClient {
private static Client client = ClientBuilder.newClient();
public static String ping() {
String serviceUrl = PropertyReader.getProperty(ServiceUrl.ECHO_SERVICE);
Response response = client
.target(serviceUrl)
.path("saySomething")
.request(ExtendedMediaType.APPLICATION_UTF8)
.get();
if (response.getStatus() == Response.Status.OK.getStatusCode()) {
return response.getEntity(String.class);
}
throw new WebApplicationException(response);
}
}
我的自定义异常处理程序,不能捕捉到上面抛出的异常:
@Provider
public class WebservletExceptionMapper implements ExceptionMapper<Exception> {
@Override
public Response toResponse(Exception exception) {
System.out.println("caught exception");
Response response;
if (exception instanceof WebApplicationException) {
response = ((WebApplicationException) exception).getResponse();
} else {
response = Response....build();
}
return response;
}
}
(第二),但如果我这样做了异常被捕获(EchoRestClient.java):
public static String ping() {
// same code then before
WebApplicationException e = new WebApplicationException(response);
throw new RuntimeException("xxxxxx", e);
}
上面我的代码工作正常,我也得到一个适当的反应,当我打电话从saySomething
其他方法我网页浏览器。
但是,如果我取消部署EchoService
其余部分(包含被调用的ping
rest方法),HTTP 404不会在第一种情况下被捕获。我需要抛出一个RuntimeException,因为WebApplicationException没有被捕获(第二种情况)。
根据文档,异常层次结构是WebApplicationException,扩展了RuntimeException。
这里有什么问题?
- 编辑 -
如果我抛出此异常则细抓:throw new WebApplicationException(response.getStatus())
但是这一次不工作:throw new WebApplicationException(response)
有什么不对的响应对象?
遗憾的是它并没有帮助。 – zappee