如何使用 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。

另请参阅: