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
}
}