从一个webapp抛出WebapplicationException并在另一个webapp上获取UniformInterfaceException

时间:2011-08-03 05:04:58

标签: java web-services jsf jersey

我看到一个奇怪的问题。我有两个webapps。一个用于我们使用Jersey公开的其余web服务。另一个有JSF前端实现,它调用webservice以上来获取细节。我们使用Tomcat作为容器。

我面临的问题是当我调用rest webservice时,我会像这样抛出WebApplicationException

catch (CustomExceptions e) {
    ResponseBuilder response = new ResponseBuilderImpl();
    response.status(500);
    response.entity(e.getStackTrace());
    throw new WebApplicationException(e, response.build()); 
}

另一方面,在FE webapps上,我执行以下操作:

try {
    r.get(MyClass.class);
    return "SUCCESS";
} catch (WebApplicationException wae) {
    return "FAILURE";
} catch (UniformInterfaceException wae) {
    return "FAILURE";
}

这里在catch块中我期待WebApplicationException但它抛出UniformInterfaceException这很奇怪。此外,如果它抛出UniformInterfaceException,它不会维护堆栈跟踪。即使是我从休息电话中传来的回应也会丢失。有人可以帮助我如何从休息电话中获得原始的堆栈跟踪?

提前致谢。

2 个答案:

答案 0 :(得分:6)

user guideapi documentation中所指定的,当您尝试按类型检索特定实体但接收非200系列响应时,UniformInterfaceException是预期结果。 WebApplicationException是一个方便的例外,供您在服务器端使用以在异常中嵌入自定义响应。

没有任何东西“丢失”。请记住,您在此处发出HTTP请求。如果您想自己检查状态代码并做出响应,请使用

ClientResponse response = r.get(ClientResponse.class);
if (response.getStatus() == <expected status code>) [
    response.getEntity(MyClass.class);
    // do happy path stuff
} else {
    // bad stuff here
}

或者,假设一切顺利,只检查异常的响应:

try {
    r.get(MyClass.class);
} catch (UniformInterfaceException e) {
    ClientResponse response = e.getResponse();
    // do whatever with the raw response
}

答案 1 :(得分:0)

之前我遇到过同样的问题。我认为这是因为Jersey WebResource.get方法仅抛出UniformInterfaceException,而WebApplicationExcpetion不在ApacheHttpClient的继承层次结构中。我做的是放弃泽西客户端api,但使用普通{{1}}。将能够在httpResponse内容中获得正确的堆栈跟踪。

希望这有帮助。


谢谢,瑞恩。我试过你的解决方案。很好。