我看到一个奇怪的问题。我有两个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,它不会维护堆栈跟踪。即使是我从休息电话中传来的回应也会丢失。有人可以帮助我如何从休息电话中获得原始的堆栈跟踪?
提前致谢。
答案 0 :(得分:6)
如user guide和api 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内容中获得正确的堆栈跟踪。
希望这有帮助。
谢谢,瑞恩。我试过你的解决方案。很好。