Пользовательские исключения WebApplicationException в jaxrs, обнаруженные ExceptionMapper, отображаются в журнале сервера.

Я использую следующий Exceptionmapper для сопоставления WebApplicationExceptions в api rest моих jaxrs с ответами.

@Provider
public class ErrorHandler implements ExceptionMapper<WebApplicationException> {
    @Override
    public Response toResponse(WebApplicationException e) {
        int status = e.getResponse().getStatus();

        JsonObject errorResponse = Json.createObjectBuilder()
                .add("status", status)
                .add("message", e.getMessage())
                .build();

        return Response.status(status)
                .entity(errorResponse)
                .type(MediaType.APPLICATION_JSON)
                .build();
    }
}

Это прекрасно работает и делает именно то, что должно, но когда я выкидываю ошибки, например throw new NotFoundException("custom message"); трассировка стека отображается в журнале моего сервера. Кто-нибудь может объяснить это? Или кто-нибудь знает решение?

TL; DR;

По какой-то причине, когда я выкидываю WebApplicationExceptions из своего кода jax-rs, мой ExceptionMapper обрабатывает ошибку, но все равно выдает ее, чтобы она отображалась в журнале сервера.

Какие-либо решения?

1 ответ

Решение

Я нашел источник этой проблемы и сумел ее решить.

Из спецификации JAX-RS

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

В моем ExceptionMapper Я использовал WebApplicationException, поэтому каждая ошибка будет отображена. Проблема в том, что WebApplicationException не ближайший суперкласс (например) NotFoundException, E сть ClientErrorException суперкласс между ними. Когда я изменил свой картограф на этот класс, проблема была решена.

Поскольку я хочу отображать только ошибки клиента в ответах Json, это решение отлично работает для меня.

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