使用 ExceptionMapper 记录 CLIENT_ERRORs

Use ExceptionMapper to log CLIENT_ERRORs

我正在开发一个使用 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 class?

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

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

或者有更好的方法吗?

JAX-RS spec 关于 ExceptionMapper:

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 class?

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

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

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