从一个web应用抛出WebapplicationException,在另一个web应用上获得UniformInterfa



我看到一个奇怪的问题。我有两个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内容中获得正确的堆栈跟踪。

希望对你有帮助。


谢谢,瑞安。我尝试了你的解决方案。很好。

相关内容

  • 没有找到相关文章

最新更新