Как получить контроллер Spring 3.0 для запуска 404?
У меня есть контроллер, @RequestMapping(value = "/**", method = RequestMethod.GET)
и для некоторых URL-адресов, обращающихся к контроллеру, я хочу, чтобы контейнер выдал 404.
java
spring
spring-mvc
NA.
источник
источник
@ResponseStatus
том, что вы определяете целую кучу строго типизированных, хорошо названных классов исключений, каждый со своим собственным@ResponseStatus
. Таким образом, вы отделяете код контроллера от подробностей кодов состояния HTTP.@ResponseStatus(value = HttpStatus.NOT_FOUND, reason="Your reason")
ResourceNotFound.fillInStackTrace()
пустую реализацию.Начиная с Spring 5.0, вам не обязательно создавать дополнительные исключения:
Кроме того, вы можете охватить несколько сценариев одним встроенным исключением, и у вас будет больше контроля.
Узнать больше:
источник
Перепишите сигнатуру вашего метода, чтобы он принимался
HttpServletResponse
в качестве параметра, чтобы вы могли вызыватьsetStatus(int)
его.http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments
источник
setStatus(int)
Javadoc заявляет следующее: Если этот метод используется для установки кода ошибки, то механизм страницы ошибок контейнера не будет запущен. Если есть ошибка, и вызывающая сторона желает вызвать страницу ошибки, определенную в веб-приложении, тоsendError
должна использоваться вместо этого.Я хотел бы отметить, что есть исключение (не только) для 404 по умолчанию, предоставляемое Spring. Подробности смотрите в документации Spring . Поэтому, если вам не нужно ваше собственное исключение, вы можете просто сделать это:
источник
@PathVariable
с моей точки зрения, нет обработки запросов. Как вы думаете, лучше / чище использовать собственное исключение с пометкой@ResponseStatus(value = HttpStatus.NOT_FOUND)
?Начиная с Spring 3.0.2 вы можете вернуть ResponseEntity <T> в результате метода контроллера:
(ResponseEntity <T> является более гибким, чем аннотация @ResponseBody - см. Другой вопрос )
источник
вы можете использовать @ControllerAdvice для обработки исключений. Поведение по умолчанию, аннотированный класс @ControllerAdvice поможет всем известным контроллерам.
поэтому он будет вызываться, когда любой ваш контроллер выдает ошибку 404.
как следующее:
и сопоставьте эту ошибку ответа 404 в вашем файле web.xml, как показано ниже:
Надеюсь, это поможет .
источник
Если ваш метод контроллера для чего-то вроде обработки файлов, то
ResponseEntity
это очень удобно:источник
Хотя отмеченный ответ является правильным, есть способ достичь этого без исключений. Служба возвращает
Optional<T>
искомый объект, и это сопоставляется,HttpStatus.OK
если найдено, и 404, если пусто.источник
Я бы порекомендовал выдать HttpClientErrorException , как это
Вы должны помнить, что это можно сделать только до того, как что-либо будет записано в выходной поток сервлета.
источник
Whitelabel Error Page \n .... \n There was an unexpected error (type=Internal Server Error, status=500). \n 404 This is your not found error
Это немного поздно, но если вы используете Spring Data REST, то уже есть.
org.springframework.data.rest.webmvc.ResourceNotFoundException
Он также использует@ResponseStatus
аннотации. Больше нет необходимости создавать пользовательское исключение во время выполнения.источник
Также, если вы хотите вернуть статус 404 с вашего контроллера, все, что вам нужно, это сделать
Делая это, вы получите ошибку 404 в случае, если вы хотите вернуть 404 от вашего контроллера.
источник
Просто вы можете использовать web.xml, чтобы добавить код ошибки и страницу ошибки 404. Но убедитесь, что страница ошибки 404 не должна находиться под WEB-INF.
Это самый простой способ сделать это, но это имеет некоторые ограничения. Предположим, если вы хотите добавить для этой страницы тот же стиль, что и для других страниц. Таким образом, вы не можете к этому. Вы должны использовать
@ResponseStatus(value = HttpStatus.NOT_FOUND)
источник
HttpServletResponse#sendError(HttpServletResponse.SC_NOT_FOUND); return null;
из кода контроллера. Теперь внешний вид отклика не отличается от обычного 404, который не попал ни в один контроллер.Настройте web.xml с настройкой
Создать новый контроллер
источник
Потому что всегда хорошо иметь как минимум десять способов сделать одно и то же:
источник