REST Web服务/ Web UI服务的单独异常映射

时间:2011-07-25 09:49:31

标签: java exception-handling jersey jax-rs

我用 Jersey 编写了一个网络服务。 此Web服务提供了可通过 REST 客户端访问的REST方法,以及用户 WebUI (基本上是简单的HTML)。

这两个方面由2个独立的“Restlet”类提供。

我已经注册了一个独特的异常映射器,它会在发生意外异常时打印整个错误和堆栈跟踪。这些异常可以由REST服务或WebUI抛出。

每当异常返回到REST客户端时,我想返回一个纯文本堆栈跟踪,并且只要它在WebUI端发生,就会返回一个漂亮的HTML错误页面。

我认为我可以通过探索请求的“接受”Http标头来寻找HTML mime类型。但该请求在 ExceptionMapper 界面中不可用。

你会怎么做?

2 个答案:

答案 0 :(得分:2)

这是一个想法:

编写一个servlet过滤器/监听器,它将HTTP请求对象存储在一个Thread Local变量中,然后您可以从异常映射器中读取该变量。

注意:在Spring中,使用RequestContextFilterRequestContextListener

可以实现这一目标

将在web.xml中添加

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

并像这样使用:

ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest req = reqAttr.getRequest(); 

如果您不使用spring,那么源代码可能会让您了解如何使用spring。希望有所帮助。

答案 1 :(得分:1)

ExceptionMapper将Exception映射到Response,然后处理Response,就好像它已由resource方法返回一样。因此,如果响应返回一个bean作为其实体而没有媒体类型,则JAX-RS规范3.8节中的算法将生效。

总之,您可以做的是:

  1. 定义bean(或将异常类型本身用作bean)
  2. 为要返回的媒体类型定义bean的MBW(text / html,application / json,text / plain)
  3. ExceptionMapper返回包含bean实例(但没有媒体类型)的Response
  4. 然后,JAX-RS运行时将使用Accept标头生成正确的响应(即选择MessageBodyWritter以生成响应)。

    如果映射器本身仍然需要来自请求的其他信息,我看到的唯一解决方案是创建自己的异常,在资源类中注入Request,并在您抛出的异常中包含对请求的引用。

    希望这有帮助。

    - 圣地亚哥