如何在不依赖于JAX-RS实现的情况下捕获404(NotFoundException)?

时间:2014-11-13 16:50:12

标签: java exception-handling jax-rs

通常使用ExceptionMapper来捕获异常,记录异常,返回自定义错误消息。

然而,当JAX-RS在其api中提供NotFoundException时,实现(Jeresy,CXF,...)提供了自己的NotFoundException(例如com.sun.jersey.api.NotFoundException),它不扩展JAX -RS one。

让我们独自选择在我们的代码实现中使用特定的导入。 如果想要切换实现,这很难。

还有另一种方法可以做到这一点,以避免依赖于特定的实现吗?

2 个答案:

答案 0 :(得分:1)

  

"有没有其他方法可以做到这一点,以避免依赖于特定的实现?"

使用支持JAX-RS 2.0的较新供应商版本。

虽然WebApplicationException Hierarchy本身自1.0以来就已存在,但WebApplicationException(即包含javax.ws.rs.NotFoundException)并未引入2.0。话虽如此,下面是开始使用JAX-RS 2.0的供应商和版本

  • Resteasy 3.0.0
  • 泽西岛(RI)2.0
  • CXF 2.7(不完整2.0 - 但关闭 - 已满3.0)

对于之前的版本,我们只需使用WebApplicationException打包回复/状态,例如
throw new WebApplicationException(Response.Status.NOT_FOUND)。然后,您可以将此异常映射到映射器,如果需要检查响应状态,则可以从异常映射getResponse().getStatus()

我们抛出的任何与JAX-RS相关的异常 not 也会包含在WebApplicationException中,因此只需将映射器映射到WebApplicationException即可让我们这样做我们需要的。所有检查都有点麻烦。

答案 1 :(得分:1)

可能的答案是使用javax.ws.rs.WebApplicationException

您可以在ExceptionMapper添加

if (e instanceof WebApplicationException) // add this towards the end of the ExceptionMapper since it is a general exception
{
         // you can use the following for log or exception handling
        int status = ((WebApplicationException) e).getResponse().getStatus();
        if (status ==Response.Status.NOT_FOUND.getStatusCode())
        {
            //deal with 404
        }
        else
        {
          // deal with other http codes
        }

}