如何使用JAX-RS捕获WebApplicationException

时间:2017-09-21 08:42:27

标签: java jersey jax-rs jersey-2.0 jersey-client

我试图用我的WebApplicationException课来抓住javax.ws.rs.ext.ExceptionMapper,但我的行为很奇怪。

这是我简单的休息方法:

@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的客户端类:

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休息(包含被调用的ping休息方法),则第一种情况下不会捕获HTTP 404。我需要抛出一个RuntimeException,因为没有捕获到WebApplicationException(第二种情况)。

根据文档,异常层次结构是WebApplicationException扩展RuntimeException。

这里有什么问题?

- 编辑 -

如果我抛出此异常,则可以正常运行:throw new WebApplicationException(response.getStatus())

但是这个不起作用:throw new WebApplicationException(response)

响应对象有问题吗?

2 个答案:

答案 0 :(得分:0)

尝试

@Provider
public class WebservletExceptionMapper implements ExceptionMapper< WebApplicationException > {

答案 1 :(得分:0)

这是由Jersey中的问题引起的。如果您的代码引发了包含Response对象的WebApplicationException,则不会调用ExceptionMappers。

另请参阅: