捕获所有exception并返回Jersey中的自定义错误

我想在jerseyrest服务中捕捉所有意想不到的例外情况。 因此我写了一个ExceptionMapper:

@Provider public class ExceptionMapper implements javax.ws.rs.ext.ExceptionMapper { private static Logger logger = LogManager.getLogManager().getLogger(ExceptionMapper.class.getName()); @Override public Response toResponse(Exception e) { logger.log(Level.SEVERE, e.getMessage(), e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Internal error").type("text/plain").build(); } } 

映射器捕获所有exception。 所以我写不出来:

 public MyResult getById(@PathParam("id")) { if (checkAnyThing) { return new MyResult(); } else { throw new WebApplicationException(Response.Status.NOT_FOUND); } } 

这是由Mapper捕获的。 现在我要写:

 public Response getById(@PathParam("id") { if (checkAnyThing) { { return Response.ok().entity(new MyResult()).build(); } else { return Response.status(Response.Status.NOT_FOUND).build(); } } 

这是捕获所有意外exception的正确方法,还会在运动衫中返回错误(错误代码)吗? 或者还有其他(更正确的)方式吗?

WebApplicationException有一个getResponse ,我们可以从中获取Response 。 因此,您可以在映射器中检查WebApplicationException 。 也许是这样的

 @Override public Response toResponse(Throwable error) { Response response; if (error instanceof WebApplicationException) { WebApplicationException webEx = (WebApplicationException)error; response = webEx.getResponse(); } else { response = Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Internal error").type("text/plain").build(); } return response; } 

这样抛出的WebApplicationException实例将只返回默认响应。 这实际上也会处理一些其他exception,而不是由您的应用程序显式抛出。 WebApplicationException在其层次结构下有一些由JAX-RS抛出的exception,其中包含预定义的响应/状态代码。

 Exception Status code Description ------------------------------------------------------------------------------- BadRequestException 400 Malformed message NotAuthorizedException 401 Authentication failure ForbiddenException 403 Not permitted to access NotFoundException 404 Couldn't find resource NotAllowedException 405 HTTP method not supported NotAcceptableException 406 Client media type requested not supported NotSupportedException 415 Client posted media type not supported InternalServerErrorException 500 General server error ServiceUnavailableException 503 Server is temporarily unavailable or busy 

话虽这么说,我们可以在代码中明确地抛出任何这些exception,只是为了给它更多的语义价值。

一般来说,上面的示例可能是不必要的,除非您想要更改响应消息/状态代码,如上表所示,exception层次结构已经有一些常规映射。 在大多数情况下,意外的exception已经映射到InternalServerErrorException