捕获所有异常,并在泽西岛中返回自定义错误

2022-09-01 23:12:02

我想在球衣休息服务中捕捉所有意想不到的异常。因此,我写了一个异常映射器:

@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();
    }
}

这是捕获所有意外异常并在球衣中返回错误(错误代码)的正确方法吗?还是有其他(更正确)的方法?


答案 1

WebApplicationException有一个getResponse,我们可以从中得到.因此,您可以在映射器中检查 a。也许像这样ResponseWebApplicationException

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

这样,抛出的实例将只返回默认响应。这实际上也会处理一些其他异常,而不是由应用程序显式抛出。 在其层次结构下还有一些由 JAX-RS 引发的异常,为此包装了预定义的响应/状态代码。WebApplicationExceptionWebApplicationException

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


答案 2

推荐