Jak uzyskać kontroler Spring 3.0, aby uruchomić 404?
Mam kontroler z @RequestMapping(value = "/**", method = RequestMethod.GET)
niektórymi adresami URL uzyskującymi dostęp do kontrolera, chcę, aby kontener wymyślił 404.
java
spring
spring-mvc
NA.
źródło
źródło
@ResponseStatus
to, że definiujesz całą grupę silnie typowanych, dobrze nazwanych klas wyjątków, każda z własną@ResponseStatus
. W ten sposób oddzielasz kod kontrolera od szczegółów kodów stanu HTTP.@ResponseStatus(value = HttpStatus.NOT_FOUND, reason="Your reason")
ResourceNotFound.fillInStackTrace()
go pustą implementacją.Począwszy od wersji 5.0 niekoniecznie musisz tworzyć dodatkowe wyjątki:
Ponadto możesz obejmować wiele scenariuszy za pomocą jednego wbudowanego wyjątku i masz większą kontrolę.
Zobacz więcej:
źródło
Przepisz sygnaturę metody, aby akceptowała
HttpServletResponse
jako parametr, abyś mógł ją wywołaćsetStatus(int)
.http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments
źródło
setStatus(int)
javadoc stwierdza, co następuje: Jeśli ta metoda zostanie użyta do ustawienia kodu błędu, wówczas mechanizm strony błędu kontenera nie zostanie uruchomiony. Jeśli wystąpił błąd, a osoba dzwoniąca chce wywołać stronę błędu zdefiniowaną w aplikacji internetowej,sendError
należy go użyć.Chciałbym wspomnieć, że istnieje wyjątek (nie tylko) dla 404 domyślnie dostarczony przez Spring. Zobacz szczegóły w dokumentacji wiosennej . Jeśli więc nie potrzebujesz własnego wyjątku, możesz po prostu to zrobić:
źródło
@PathVariable
z mojego punktu widzenia nie ma obsługi żądań. Czy uważasz, że lepiej / czysto używać własnego wyjątku opatrzonego adnotacjami@ResponseStatus(value = HttpStatus.NOT_FOUND)
?Od wersji 3.0.2 możesz zwrócić ResponseEntity <T> w wyniku zastosowania metody kontrolera:
(ResponseEntity <T> jest bardziej elastyczna niż adnotacja @ResponseBody - zobacz inne pytanie )
źródło
możesz użyć @ControllerAdvice do obsługi wyjątków. Domyślne zachowanie klasy z adnotacjami @ControllerAdvice pomoże wszystkim znanym kontrolerom.
więc zostanie wywołany, gdy dowolny kontroler, który masz, zgłasza błąd 404.
jak następujące:
i zamapuj ten błąd odpowiedzi 404 w pliku web.xml, na przykład:
Mam nadzieję, że to pomaga.
źródło
Jeśli twoja metoda kontrolera służy do obsługi plików,
ResponseEntity
jest to bardzo przydatne:źródło
Chociaż zaznaczona odpowiedź jest poprawna, istnieje sposób na osiągnięcie tego bez wyjątków. Usługa zwraca
Optional<T>
szukany obiekt, który jest odwzorowywany na,HttpStatus.OK
jeśli został znaleziony, i na 404, jeśli jest pusty.źródło
Ja polecam rzucania HttpClientErrorException , jak to
Musisz pamiętać, że można to zrobić tylko przed zapisaniem czegokolwiek w strumieniu wyjściowym serwletu.
źródło
Whitelabel Error Page \n .... \n There was an unexpected error (type=Internal Server Error, status=500). \n 404 This is your not found error
To trochę za późno, ale jeśli używasz Spring Data REST, to już jest.
org.springframework.data.rest.webmvc.ResourceNotFoundException
Używa także@ResponseStatus
adnotacji. Nie ma już potrzeby tworzenia niestandardowego wyjątku czasu wykonywania.źródło
Również, jeśli chcesz zwrócić status 404 ze swojego kontrolera, wystarczy to zrobić
W ten sposób otrzymasz błąd 404 w przypadku, gdy chcesz zwrócić 404 ze swojego kontrolera.
źródło
Wystarczy użyć pliku web.xml, aby dodać kod błędu i stronę błędu 404. Ale upewnij się, że strona błędu 404 nie może znaleźć się pod WEB-INF.
Jest to najprostszy sposób na zrobienie tego, ale ma to pewne ograniczenia. Załóżmy, że chcesz dodać ten sam styl dla tej strony, co inne strony. W ten sposób nie możesz tego zrobić. Musisz użyć
@ResponseStatus(value = HttpStatus.NOT_FOUND)
źródło
HttpServletResponse#sendError(HttpServletResponse.SC_NOT_FOUND); return null;
z kodu kontrolera. Teraz z zewnątrz odpowiedź nie różni się niczym od zwykłego 404, który nie uderzył w żaden kontroler.Skonfiguruj plik web.xml z ustawieniem
Utwórz nowy kontroler
źródło
Ponieważ zawsze dobrze jest mieć co najmniej dziesięć sposobów na zrobienie tego samego:
źródło