我想在球衣休息服务中捕获所有意外的异常。因此我写了一个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();
}
}
映射器实际上捕获了所有异常。因此,我不能写:
public MyResult getById(@PathParam("id")) {
if (checkAnyThing) {
return new MyResult();
}
else {
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
}
这是由映射器捕获的。现在我要写:
public Response getById(@PathParam("id") {
if (checkAnyThing) { {
return Response.ok().entity(new MyResult()).build();
}
else {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
这是捕获所有意外异常并还返回球衣中的错误(错误代码)的正确方法吗?还是还有其他(更正确的)方法?
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
thrown的实例将只返回默认响应。实际上,这还将处理其他一些异常,而不是由您的应用程序明确抛出。WebApplicationException
JAX-RS在其层次结构下具有其他一些异常,为此包装了预定义的响应/状态代码。
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
话虽如此,我们可以在我们的代码中显式地抛出任何这些异常,只是为了赋予它更多的语义价值。
但是,通常来说,上面的示例可能是不必要的,除非您想要更改响应消息/状态代码(如上表所示),异常的层次结构已经具有一些常规映射。在大多数情况下,意外的异常将已经映射到InternalServerErrorException
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句