Как обрабатывать redirect Spring Boot в / error?

Я столкнулся с той же проблемой, что и в этом вопросе , используя Spring Boot 1.3.0 и не имея controllerов, аннотированных с помощью @RestController , просто @Path и @Service . Как говорит ОП в этом вопросе,

это для меня ничего, кроме разумного

Я также не могу понять, почему они перенаправляют его на / error. И очень вероятно, что я что-то пропустил , потому что я могу только вернуть 404s или 200s клиенту.

Моя проблема заключается в том, что его решение, похоже, не работает с 1.3.0, поэтому у меня есть следующий stream запросов: скажем, мой код NullPointerException . Он будет обработан одним из моих ExceptionMapper s

 @Provider public class GeneralExceptionMapper implements ExceptionMapper { private static final Logger LOGGER = LoggerFactory.getLogger(GeneralExceptionMapper.class); @Override public Response toResponse(Throwable exception) { LOGGER.error(exception.getLocalizedMessage()); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } } 

И мой код возвращает 500, но вместо отправки обратно клиенту он пытается перенаправить его на / error. Если у меня нет другого ресурса для этого, он отправит обратно 404.

 2015-12-16 18:33:21.268 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 1 * Server has received a request on thread http-nio-8080-exec-1 1 > GET http://localhost:8080/nullpointerexception 1 > accept: */* 1 > host: localhost:8080 1 > user-agent: curl/7.45.0 2015-12-16 18:33:29.492 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 1 * Server responded with a response on thread http-nio-8080-exec-1 1  GET http://localhost:8080/error 2 > accept: */* 2 > host: localhost:8080 2 > user-agent: curl/7.45.0 2015-12-16 18:33:37.249 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 2 * Server responded with a response on thread http-nio-8080-exec-1 2 < 404 

И клиентская сторона (curl):

 $ curl -v http://localhost:8080/nullpointerexception * STATE: INIT => CONNECT handle 0x6000572d0; line 1090 (connection #-5000) * Added connection 0. The cache now contains 1 members * Trying ::1... * STATE: CONNECT => WAITCONNECT handle 0x6000572d0; line 1143 (connection #0) * Connected to localhost (::1) port 8080 (#0) * STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x6000572d0; line 1240 (connection #0) * STATE: SENDPROTOCONNECT => DO handle 0x6000572d0; line 1258 (connection #0) > GET /nullpointerexception HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.45.0 > Accept: */* > * STATE: DO => DO_DONE handle 0x6000572d0; line 1337 (connection #0) * STATE: DO_DONE => WAITPERFORM handle 0x6000572d0; line 1464 (connection #0) * STATE: WAITPERFORM => PERFORM handle 0x6000572d0; line 1474 (connection #0) * HTTP 1.1 or later with persistent connection, pipelining supported < HTTP/1.1 404 Not Found * Server Apache-Coyote/1.1 is not blacklisted < Server: Apache-Coyote/1.1 < Content-Length: 0 < Date: Wed, 16 Dec 2015 17:33:37 GMT  DONE handle 0x6000572d0; line 1632 (connection #0) * Curl_done * Connection #0 to host localhost left intact 

Так что это всегда 404. Если у меня нет такого ресурса / ошибки, то что? что я должен вернуться? Все, что у меня есть, – это запрос GET для / error. И я не хочу, чтобы эти дополнительные запросы потребляли ресурсы и загрязняли мои журналы.

Что мне не хватает? И если ничего, что мне делать с обработкой исключений?

Вы можете установить для свойства Jersey свойство ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR значение true .

Всякий раз, когда статус ответа равен 4xx или 5xx можно выбрать между sendError или setStatus для реализации конкретного ответа на конкретный контейнер. Например, в контейнере сервлетов Джерси может вызывать HttpServletResponse.setStatus(...) или HttpServletResponse.sendError(...) .

Вызов sendError(...) обычно сбрасывает сущность, заголовки ответов и предоставляет страницу с ошибкой для указанного кода состояния (например, конфигурацию error-page сервлета). Однако, если вы хотите выполнить пост-обработку ответа (например, с помощью фильтра сервлета), единственный способ сделать это – вызвать setStatus(...) в объекте Response объекта.

Если значение свойства истинно, метод Response.setStatus(...) используется по умолчанию Response.sendError(...) .

Тип значения свойства имеет значение boolean . Значение по умолчанию – false .

Вы можете установить свойство Jersey просто путем вызова property(key, value) в вашем конструкторе подclassа ResourceConfig .

  • Как передать параметры JVM из bootRun
  • Горячая замена в Spring Boot
  • Spring Boot перенаправляет HTTP на HTTPS
  • Как получить доступ к значению, определенному в файле application.properties в Spring Boot
  • Разверните Spring Boot для Tomcat
  • Spring Boot + JPA: аннотация annotations имени столбца игнорируется
  • Spring Boot: не удается получить доступ к controllerу REST на localhost (404)
  • Добавить сервлет-фильтр в приложении Spring Boot
  • Обновление статического содержимого с помощью Spring MVC и Boot
  • Рассмотрим определение компонента типа «package» в вашей конфигурации
  • org.hibernate.HibernateException: доступ к DialectResolutionInfo не может быть нулевым, если «hibernate.dialect» не установлен
  • Давайте будем гением компьютера.