@Provider
public class JerseyExceptionMapper implements ExceptionMapper<JerseyException> {
@Override
public Response toResponse(JerseyException jerseyException) {
return Response.status(jerseyException.getErrorCode()).
entity(jerseyException.getJsonResponseObj()).
type(MediaType.APPLICATION_JSON).
build();
}
}
Приведенный выше код имеет нежелательные результаты при использовании компонента <error-page>
в web.xml
. Например, если мой Response.status
установлен в 400, а мой error-page
компонент определяет <error-code>
из 400, веб-сервер перенаправляет запрос в местоположение, определенное в web.xml
.
Это явно не то, что я хочу для запросов REST. Я прочитал еще одно сообщение в StackOverflow, в котором говорится, что причина, по которой запрос переадресовывается в error-page
, происходит потому, что установлен HttpServletResponse.sendError(400)
. Этот пост сказал, что если вы установите вместо HttpServletResponse.setStatus(400)
, error-page
будет проигнорирован.
Если это так, я не вижу, как это полезно, поскольку я не реализовал код Джерси. Опция, которую я вижу, заключается в том, чтобы исследовать исходный код класса Response и, возможно, повторно реализовать метод статуса или, возможно, другой код Джерси. Есть ли простой вариант здесь или что-то, что мне не хватает?
По сути, мой вопрос: учитывая, что я использую Джерси для REST, и я использую страницу с ошибками в своем web.xml
, как я могу использовать вышеуказанный код, игнорируя только код error-page
только для Джерси? Любой другой код, вызывающий ошибки HTTP, должен перейти в error-page
. Или есть другое решение, которое не включает error-page
, но будет работать идентично тому, что я хочу?