Ответ 1
Я могу воспроизвести проблему, но только если я передаю null
как содержимое сущности.
Пример:
return Response.status(400)
.entity(null)
.type(MediaType.APPLICATION_JSON)
.build();
или даже
return Response.status(400)
.type(MediaType.APPLICATION_JSON)
.build();
Оба будут приводить к перенаправлению на страницу с ошибкой, которая настроена для кода статуса HTTP 400, потому что контейнер будет использовать sendError(), если не указано содержание сообщения.
Но если вы сделаете это так:
return Response.status(400)
.entity("An error occured.")
.type(MediaType.APPLICATION_JSON)
.build();
или это:
return Response.status(400)
.entity("")
.type(MediaType.APPLICATION_JSON)
.build();
контейнер/трикотаж будет использовать метод setStatus() и не перенаправляется на страницу с ошибкой. Как указано в документах:
Этот метод используется для установки кода возврата, когда нет (например, для статуса SC_OK или SC_MOVED_TEMPORARILY коды).
Если этот метод используется для установки кода ошибки, то контейнер механизм страницы ошибки не будет запущен. Если есть ошибка и вызывающий объект хочет вызвать страницу ошибки, определенную в сети приложение, тогда необходимо использовать sendError (int, java.lang.String) вместо этого.
Итак, в вашем случае проблема заключается в том, что jerseyException.getJsonResponseObj()
возвращает null
. Чтобы избежать этого, вы должны выполнить проверку нулевого значения.
Существует ошибка JERSEY-1557 для Jersey 1.x, которая описывает проблему, она была закрыта без исправления, но с рекомендацией используйте пустую строку сущности в качестве обходного пути.
Существует также аналогичная ошибка, открытая для Jersey 2.x: JERSEY-2673
См. также: