Используйте ExceptionMapper для регистрации CLIENT_ERROR

Я работаю над приложением, в котором используется 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_ERROR, так и SERVER_ERROR.

Мне интересно, как мое приложение узнает, что ему нужно использовать 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();
    }

Или был бы лучший способ сделать это?

1 ответ

Решение

Спецификация JAX-RS о ExceptionMapper:

При выборе поставщика сопоставления исключений для сопоставления исключения реализация ДОЛЖНА использовать поставщика, универсальный тип которого является ближайшим суперклассом исключения.

Как бы мое приложение узнало, что ему нужно использовать CustomExceptionMapper вместо класса Dropwizard?

Вы можете выбросить пользовательское исключение из вашего приложения и создать ExceptionMapper для этого конкретного исключения.

Достаточно ли добавить CLIENT_ERROR в условие if, чтобы завершить все ошибки?

Да, у семейства 4xx и 5xx есть все сообщения об ошибках.

Другие вопросы по тегам