如何使用 JAX-RS 捕获 WebApplicationException
How to catch WebApplicationException with JAX-RS
我正在尝试用我的 javax.ws.rs.ext.ExceptionMapper
class 捕捉 WebApplicationException
但我的行为很奇怪。
这是我简单的休息方法:
@GET
@Path("/saySomething")
public List<String> saySomething() {
String response = EchoRestClient.ping();
List<String> list = new ArrayList<>();
list.add(response);
list.add("okay");
return list;
}
(1st) 这是调用另一个 rest api:
的客户端 class
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;
}
}
(2nd) 但是如果我这样做,异常就会被捕获 (EchoRestClient.java):
public static String ping() {
// same code then before
WebApplicationException e = new WebApplicationException(response);
throw new RuntimeException("xxxxxx", e);
}
我上面的代码工作正常,当我从我的网络浏览器调用 saySomething
rest 方法时,我得到了正确的响应。
但是如果我取消部署 EchoService
rest(包含调用的 ping
rest 方法),在第一种情况下不会捕获 HTTP 404。我需要抛出一个 RuntimeException,因为没有捕获到 WebApplicationException(第二种情况)。
根据文档,异常层次结构是 WebApplicationException extends RuntimeException。
这里有什么问题?
-- 编辑--
如果我抛出这个异常,它就会被捕获:throw new WebApplicationException(response.getStatus())
但是这个不行:throw new WebApplicationException(response)
响应对象有问题吗?
这是由泽西岛的一个问题引起的。如果您的代码抛出包含 Response 对象的 WebApplicationException,则不会调用 ExceptionMappers。
另请参阅:
- https://github.com/eclipse-ee4j/jersey/issues/3716
- ExceptionMapper not working as expected
我正在尝试用我的 javax.ws.rs.ext.ExceptionMapper
class 捕捉 WebApplicationException
但我的行为很奇怪。
这是我简单的休息方法:
@GET
@Path("/saySomething")
public List<String> saySomething() {
String response = EchoRestClient.ping();
List<String> list = new ArrayList<>();
list.add(response);
list.add("okay");
return list;
}
(1st) 这是调用另一个 rest api:
的客户端 classpublic 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;
}
}
(2nd) 但是如果我这样做,异常就会被捕获 (EchoRestClient.java):
public static String ping() {
// same code then before
WebApplicationException e = new WebApplicationException(response);
throw new RuntimeException("xxxxxx", e);
}
我上面的代码工作正常,当我从我的网络浏览器调用 saySomething
rest 方法时,我得到了正确的响应。
但是如果我取消部署 EchoService
rest(包含调用的 ping
rest 方法),在第一种情况下不会捕获 HTTP 404。我需要抛出一个 RuntimeException,因为没有捕获到 WebApplicationException(第二种情况)。
根据文档,异常层次结构是 WebApplicationException extends RuntimeException。
这里有什么问题?
-- 编辑--
如果我抛出这个异常,它就会被捕获:throw new WebApplicationException(response.getStatus())
但是这个不行:throw new WebApplicationException(response)
响应对象有问题吗?
这是由泽西岛的一个问题引起的。如果您的代码抛出包含 Response 对象的 WebApplicationException,则不会调用 ExceptionMappers。
另请参阅:
- https://github.com/eclipse-ee4j/jersey/issues/3716
- ExceptionMapper not working as expected