我看到一个奇怪的问题。我有两个webapps。一个用于我们使用Jersey公开的其余web服务。另一个具有JSF前端实现,它调用上述web服务来获取详细信息。我们使用Tomcat作为容器。
我面临的问题是,当我调用一个rest的web服务,我抛出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,它不维护堆栈跟踪。甚至我从休息调用传入的响应也丢失了。有人能帮助我,我怎么能得到原来的堆栈跟踪从休息调用?
正如用户指南和api文档中指定的那样,当您尝试按类型检索特定实体但收到非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
}
我以前也有过同样的问题。我认为这是因为Jersey WebResource.get
方法只抛出UniformInterfaceException
,这不在WebApplicationExcpetion
的继承层次结构中。我所做的是放弃Jersey客户端api,而是使用普通的ApacheHttpClient
。将能够在httpResponse内容中获得正确的堆栈跟踪。
希望对你有帮助。
谢谢,瑞安。我尝试了你的解决方案。很好。