Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何捕获404(NotFoundException),而不深入JAX-RS实现?_Java_Exception Handling_Jax Rs - Fatal编程技术网

Java 如何捕获404(NotFoundException),而不深入JAX-RS实现?

Java 如何捕获404(NotFoundException),而不深入JAX-RS实现?,java,exception-handling,jax-rs,Java,Exception Handling,Jax Rs,通常使用ExceptionMapper捕获异常,记录它们,返回自定义的错误消息 然而,虽然JAX-RS在其api中提供了一个NotFoundException,但实现(Jeresy、CXF等)提供了自己的NotFoundException(例如com.sun.jersey.api.NotFoundException),而不是扩展JAX-RS 让我们有唯一的选择,在我们的代码实现中有特定的导入。 这使得人们很难切换实现 是否有其他方法可以做到这一点,以避免对特定实现的依赖 “是否有其他方法可以做到

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

然而,虽然JAX-RS在其api中提供了一个
NotFoundException
,但实现(Jeresy、CXF等)提供了自己的NotFoundException(例如
com.sun.jersey.api.NotFoundException
),而不是扩展JAX-RS

让我们有唯一的选择,在我们的代码实现中有特定的导入。 这使得人们很难切换实现

是否有其他方法可以做到这一点,以避免对特定实现的依赖

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

使用支持JAX-RS2.0的较新供应商版本

虽然自1.0开始就存在,但直到2.0才引入(即包含
javax.ws.rs.NotFoundException
)。也就是说,下面是开始使用JAX-RS2.0的供应商和版本

  • Resteasy 3.0.0
  • 泽西岛(RI)2.0
  • CXF 2.7(不是完整的2.0版本,而是接近完整的3.0版本)
对于以前的版本,我们可以使用
WebApplicationException
包装响应/状态,比如
抛出新的WebApplicationException(response.status.NOT_FOUND)
。然后,您可以将此异常映射到映射器,如果需要检查响应状态,还可以从异常中映射
getResponse().getStatus()


任何与JAX-RS相关的异常(不是由我们引发的)也将被包装在
WebApplicationException
中,因此只要将映射器映射到
WebApplicationException
就应该允许我们做我们需要的事情。做所有的检查都有点麻烦

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

在您的
例外标记中
可以添加

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
        }

}