JAX-RS (реализация джерси) ExceptionMapper <Throwable>не перехватывает ConstraintViolationException - PullRequest
0 голосов
/ 30 октября 2018

У меня есть ExceptionMapper как Provider для обработки всех моих исключений.

, так что очевидно, что мой класс реализует ExceptionMapper<Throwable>, и мы, как известно, все исключения как-то расширены Throwable.

теперь я использовал jax-rs @NotNull, чтобы проверить, что входные значения моих ресурсов не равны NULL, и при некотором поиске я понял, что будет выброшено ConstraintViolationException, когда аннотированное поле будет нулевым.

поэтому я попытался обработать это и добавить некоторые детали к ответу (добавить некоторую пользовательскую модель json) в моем ExceptionMapper, например:

@Provider
public class AllExceptionMapper implements ExceptionMapper<Throwable> {

    private final Logger logger = LogManager.getLogger(AllExceptionMapper.class);

    @Override
    public Response toResponse(Throwable ex) {
        Response response;
        CustomError error;
        // handle some errors

        else if (ex instanceof ConstraintViolationException) {
             error = new CustomError(
                 324, // predefined error type in our documents
                 "some details"
             );
             response = Response.status(Response.Status.BAD_REQUEST).entity(error).build();
        }

        // handle some other errors

        return response;
    }

}

проблема в , это не сработало , но если бы я создал другого поставщика картографирования исключений, который реализует ExceptionMapper<ConstraintViolationException> и обработал бы его там, он работал бы без проблем.

как я уже говорил (и также проверял), все исключения как-то расширены из класса Throwable, так что я пропускаю и почему он не работает?

......

не работал, я имею в виду, что он игнорирует мой маппер (тот, который реализуется с ExceptionMapper<Throwable>) и имел нормальное поведение, которое возвращает код состояния 400 без полезной нагрузки ответа, как будто вообще нет маппера

1 Ответ

0 голосов
/ 30 октября 2018

Способ работы ExceptionMapper заключается в том, что вы можете создать универсальный ExceptionMapper<Throwable>, который обрабатывает все ошибки. И тогда вы можете создавать более конкретные ExceptionMapper, которые обрабатывают более конкретные ошибки другим способом. Все это в отдельных классах.

Тот факт, что выполнение этого в отдельном классе работает для вас, позволяет мне поверить, что где-то есть более конкретный ExceptionMapper, который обрабатывает исключение, прежде чем вы сможете.

Способ, которым ExceptionMappers предназначены для использования, на самом деле очень чист, а также сохраняет ваш код в чистоте. Желание сохранить код в одном центральном месте приведет к гигантскому if ...

...