Java 如何使用JAX-RS捕获WebApplicationException

Java 如何使用JAX-RS捕获WebApplicationException,java,jersey,jax-rs,jersey-2.0,jersey-client,Java,Jersey,Jax Rs,Jersey 2.0,Jersey Client,我试图用我的javax.ws.rs.ext.ExceptionMapper类捕获WebApplicationException,但我得到了一个奇怪的行为 这是我的简单休息方法: @GET @Path("/saySomething") public List<String> saySomething() { String response = EchoRestClient.ping(); List<String> list = new ArrayList&l

我试图用我的
javax.ws.rs.ext.ExceptionMapper
类捕获
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;
}
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;
    }
}
和我的自定义异常处理程序,它不会捕获上述抛出的异常:

@GET
@Path("/saySomething")
public List<String> saySomething() {
    String response = EchoRestClient.ping();
    List<String> list = new ArrayList<>();
    list.add(response);
    list.add("okay");
    return list;
}
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;
    }
}
我上面的代码工作正常,当我从web浏览器调用
saySomething
rest方法时,我得到了正确的响应

但是,如果我取消部署
EchoService
rest(包含调用的
ping
rest方法),则在第一种情况下不会捕获HTTP 404。我需要抛出RuntimeException,因为WebApplicationException未被捕获(第二种情况)

根据文档,异常层次结构是WebApplicationException extends RuntimeException

这里怎么了

--编辑--

如果我抛出这个异常,那么它就被捕获了:
抛出新的WebApplicationException(response.getStatus())

但这一个不起作用:
抛出新的WebApplicationException(response)


响应对象中是否有问题?

这是由Jersey中的问题引起的。如果代码抛出包含响应对象的WebApplicationException,则不会调用ExceptionAppers

另见:


    • 这是由泽西岛的一个问题引起的。如果代码抛出包含响应对象的WebApplicationException,则不会调用ExceptionAppers

      另见:


      欢迎使用堆栈溢出。我们鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。谢谢。欢迎来到堆栈溢出。我们鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。谢谢