Используйте ExceptionMapper для регистрации CLIENT_ERROR - PullRequest
0 голосов
/ 10 сентября 2018

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

0 голосов
/ 14 сентября 2018

JAX-RS spec о ExceptionMapper:

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

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

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

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

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

...