捕获所有异常并返回 Jersey 中的自定义错误
我想在球衣休息服务中捕获所有意外异常.因此我写了一个 ExceptionMapper:
I want to catch all unexpected Exceptions in a jersey rest service. Therefore i wrote an ExceptionMapper:
@Provider
public class ExceptionMapper implements javax.ws.rs.ext.ExceptionMapper<Exception> {
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();
}
}
映射器确实捕获了所有异常.因此我不能写:
The mapper catches really all exceptions. Therefore i can't write:
public MyResult getById(@PathParam("id")) {
if (checkAnyThing) {
return new MyResult();
}
else {
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
}
这被映射器捕获.现在我必须写:
This is catched by the Mapper. Now i have to write:
public Response getById(@PathParam("id") {
if (checkAnyThing) { {
return Response.ok().entity(new MyResult()).build();
}
else {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
这是捕获所有意外异常并在球衣中返回错误(错误代码)的正确方法吗?或者还有其他(更正确的)方法吗?
Is this the correct way to catch all unexpected exceptions and also return errors (error codes) in jersey? Or is there any other (more correct) way?
推荐答案
WebApplicationException
有一个 getResponse
从中我们可以得到 Response
.因此,您可以在映射器中检查 WebApplicationException
.也许像
WebApplicationException
has a getResponse
from which we can get the Response
. So you can check for a WebApplicationException
in your mapper. Maybe something like
@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
实例只会返回默认响应.这实际上也将处理一些其他异常,而不是由您的应用程序明确抛出.WebApplicationException
在其层次结构下还有一些由 JAX-RS 引发的其他异常,其中包含预定义的响应/状态代码.
That way an instance of WebApplicationException
thrown will just return the default response. This will actually handle some other exceptions also, not thrown explictly by your application. WebApplicationException
has a few other exception under its hierarchy that are thrown by JAX-RS, for which predefined response/status codes are wrapped.
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
话虽如此,我们可以在代码中显式抛出任何这些异常,只是为了赋予它更多语义价值.
That being said, we could explicitly throw any of these exceptions in our code, just to give it more semantic value.
一般来说,上面的例子可能是不必要的,除非你想改变响应消息/状态代码,从上面的表格中可以看出,异常的层次结构已经有了一些一般的映射.而且在大多数情况下,意外异常已经映射到 InternalServerErrorException
Generally speaking though, the example above may be unnecessary, unless you want to alter the response message/status code, as one can from the table above, the hierarchy of exceptions already have some general mapping. And in most cases, unexpected exceptions will already be mapped to InternalServerErrorException
相关文章