Wie kann ich einen Spring 3.0-Controller dazu bringen, einen 404 auszulösen?
Ich habe einen Controller mit @RequestMapping(value = "/**", method = RequestMethod.GET)
und für einige URLs, die auf den Controller zugreifen, möchte ich, dass der Container einen 404 ausgibt.
java
spring
spring-mvc
N / A.
quelle
quelle
@ResponseStatus
ist, dass Sie eine ganze Reihe von stark typisierten, gut benannten Ausnahmeklassen definieren, jede mit ihren eigenen@ResponseStatus
. Auf diese Weise entkoppeln Sie Ihren Controller-Code von den Details der HTTP-Statuscodes.@ResponseStatus(value = HttpStatus.NOT_FOUND, reason="Your reason")
ResourceNotFound.fillInStackTrace()
mit einer leeren Implementierung zu überschreiben .Ab Spring 5.0 müssen Sie nicht unbedingt zusätzliche Ausnahmen erstellen:
Sie können auch mehrere Szenarien mit einer integrierten Ausnahme abdecken und haben mehr Kontrolle.
Mehr sehen:
quelle
Schreiben Sie Ihre Methodensignatur so um, dass sie
HttpServletResponse
als Parameter akzeptiert wird, damit Sie sie aufrufensetStatus(int)
können.http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments
quelle
setStatus(int)
javadoc gibt Folgendes an: Wenn diese Methode zum Festlegen eines Fehlercodes verwendet wird, wird der Fehlerseitenmechanismus des Containers nicht ausgelöst. Wenn ein Fehler vorliegt und der Anrufer eine in der Webanwendung definierte Fehlerseite aufrufen möchte,sendError
muss diese stattdessen verwendet werden.Ich möchte erwähnen, dass es standardmäßig eine Ausnahme (nicht nur) für 404 gibt, die von Spring bereitgestellt wird. Weitere Informationen finden Sie in der Spring-Dokumentation . Wenn Sie also keine eigene Ausnahme benötigen, können Sie dies einfach tun:
quelle
@PathVariable
gibt es aus meiner Sicht keine Anforderungsbearbeitung. Denken Sie, dass es besser / sauberer ist, eine eigene Ausnahme zu verwenden, die mit Anmerkungen versehen ist@ResponseStatus(value = HttpStatus.NOT_FOUND)
?Seit Spring 3.0.2 können Sie ResponseEntity <T> als Ergebnis der Controller-Methode zurückgeben:
(ResponseEntity <T> ist flexibler als die @ ResponseBody-Annotation - siehe eine andere Frage )
quelle
Sie können das @ControllerAdvice verwenden , um Ihre Ausnahmen zu behandeln. Das Standardverhalten der mit @ControllerAdvice kommentierten Klasse unterstützt alle bekannten Controller.
Daher wird es aufgerufen, wenn ein Controller, den Sie haben, einen 404-Fehler auslöst.
wie folgt:
und ordnen Sie diesen 404-Antwortfehler in Ihrer web.xml wie folgt zu:
Hoffentlich hilft das .
quelle
Wenn Ihre Controller-Methode für die Dateiverwaltung vorgesehen ist,
ResponseEntity
ist dies sehr praktisch:quelle
Obwohl die markierte Antwort korrekt ist, gibt es eine Möglichkeit, dies ausnahmslos zu erreichen. Der Dienst gibt
Optional<T>
das gesuchte Objekt zurück und dieses wird zugeordnet,HttpStatus.OK
wenn es gefunden wird, und 404, wenn es leer ist.quelle
Ich würde empfehlen, HttpClientErrorException wie folgt auszulösen
Sie müssen sich daran erinnern, dass dies nur möglich ist, bevor etwas in den Servlet-Ausgabestream geschrieben wird.
quelle
Whitelabel Error Page \n .... \n There was an unexpected error (type=Internal Server Error, status=500). \n 404 This is your not found error
Dies ist etwas spät, aber wenn Sie Spring Data REST verwenden, gibt es bereits
org.springframework.data.rest.webmvc.ResourceNotFoundException
eine@ResponseStatus
Annotation. Es ist nicht mehr erforderlich, eine benutzerdefinierte Laufzeitausnahme zu erstellen.quelle
Auch wenn Sie den 404-Status von Ihrem Controller zurückgeben möchten, müssen Sie dies nur tun
Auf diese Weise erhalten Sie einen 404-Fehler, falls Sie einen 404 von Ihrem Controller zurückgeben möchten.
quelle
Sie können einfach web.xml verwenden, um Fehlercode und 404-Fehlerseite hinzuzufügen. Stellen Sie jedoch sicher, dass sich die 404-Fehlerseite nicht unter WEB-INF befindet.
Dies ist der einfachste Weg, dies hat jedoch einige Einschränkungen. Angenommen, Sie möchten für diese Seite denselben Stil hinzufügen, den Sie für andere Seiten hinzugefügt haben. Auf diese Weise können Sie nicht dazu. Sie müssen die verwenden
@ResponseStatus(value = HttpStatus.NOT_FOUND)
quelle
HttpServletResponse#sendError(HttpServletResponse.SC_NOT_FOUND); return null;
anhand des Controller-Codes. Von außen sieht die Reaktion nicht anders aus als bei einem normalen 404, der keinen Controller getroffen hat.Konfigurieren Sie web.xml mit der Einstellung
Erstellen Sie einen neuen Controller
quelle
Weil es immer gut ist, mindestens zehn Möglichkeiten zu haben, dasselbe zu tun:
quelle