0

我正在开发一个使用 Dropwizard 的应用程序,它具有 ExceptionMapper 的这种实现:https ://github.com/dropwizard/dropwizard/blob/master/dropwizard-jersey/src/main/java/io/dropwizard/jersey/errors /LoggingExceptionMapper.java

这个实现的问题是,即使它捕获了 4** 和 5** 错误,它也只记录了 5** 错误。

我需要实现 ExceptionMapper,以便根本不使用 LoggingExceptionMapper,并且我的 CustomExceptionMapper 同时记录 CLIENT_ERRORs 和 SERVER_ERRORs。

我想知道我的应用程序如何知道它需要使用 CustomExceptionMapper 而不是 Dropwizard 类?

将 CLIENT_ERROR 添加到 if 条件以注销所有错误是否就足够了?

@Override
public Response toResponse(E exception) {
    // If we're dealing with a web exception, we can service certain types of request (like
    // redirection or server errors) better and also propagate properties of the inner response.
    if (exception instanceof WebApplicationException) {
        final Response response = ((WebApplicationException) exception).getResponse();
        Response.Status.Family family = response.getStatusInfo().getFamily();
        if (family.equals(Response.Status.Family.REDIRECTION)) {
            return response;
        }
        if (family.equals(Response.Status.Family.SERVER_ERROR) || family.equals(Response.Status.Family.CLIENT_ERROR) {
            logException(exception);
        }

        return Response.fromResponse(response)
                .type(MediaType.APPLICATION_JSON_TYPE)
                .entity(new ErrorMessage(response.getStatus(), exception.getLocalizedMessage()))
                .build();
    }

还是有更好的方法来做到这一点?

4

1 回答 1

2

关于 ExceptionMapper的 JAX-RS 规范:

When choosing an exception mapping provider to map an exception, an implementation MUST use the provider whose generic type is the nearest superclass of the exception.

我的应用程序如何知道它需要使用 CustomExceptionMapper 而不是 Dropwizard 类?

您可以从应用程序中抛出自定义异常,并为该特定异常创建一个 ExceptionMapper。

将 CLIENT_ERROR 添加到 if 条件是否足以注销所有错误?

是的,4xx 和 5xx 系列具有所有错误响应。

于 2018-09-13T21:59:33.017 回答