Пользовательские исключения 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 ответ
Я нашел источник этой проблемы и сумел ее решить.
При выборе поставщика сопоставления исключений для сопоставления исключения реализация ДОЛЖНА использовать поставщика, универсальный тип которого является ближайшим суперклассом исключения.
В моем ExceptionMapper
Я использовал WebApplicationException
, поэтому каждая ошибка будет отображена. Проблема в том, что WebApplicationException
не ближайший суперкласс (например) NotFoundException
, E сть ClientErrorException
суперкласс между ними. Когда я изменил свой картограф на этот класс, проблема была решена.
Поскольку я хочу отображать только ошибки клиента в ответах Json, это решение отлично работает для меня.