通常使用ExceptionMapper
来捕获异常,记录异常,返回自定义错误消息。
然而,当JAX-RS在其api中提供NotFoundException
时,实现(Jeresy,CXF,...)提供了自己的NotFoundException(例如com.sun.jersey.api.NotFoundException
),它不扩展JAX -RS one。
让我们独自选择在我们的代码实现中使用特定的导入。 如果想要切换实现,这很难。
还有另一种方法可以做到这一点,以避免依赖于特定的实现吗?
答案 0 :(得分:1)
"有没有其他方法可以做到这一点,以避免依赖于特定的实现?"
使用支持JAX-RS 2.0的较新供应商版本。
虽然WebApplicationException Hierarchy本身自1.0以来就已存在,但WebApplicationException
(即包含javax.ws.rs.NotFoundException
)并未引入2.0。话虽如此,下面是开始使用JAX-RS 2.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
}
}