Comment puis-je obtenir un contrôleur Spring 3.0 pour déclencher un 404?
J'ai un contrôleur avec @RequestMapping(value = "/**", method = RequestMethod.GET)
et pour certaines URL accédant au contrôleur, je veux que le conteneur propose un 404.
java
spring
spring-mvc
N / A.
la source
la source
@ResponseStatus
est que vous définissez tout un tas de classes d'exceptions bien typées et bien nommées, chacune avec ses propres@ResponseStatus
. De cette façon, vous dissociez votre code de contrôleur du détail des codes d'état HTTP.@ResponseStatus(value = HttpStatus.NOT_FOUND, reason="Your reason")
ResourceNotFound.fillInStackTrace()
avec une implémentation vide.À partir de Spring 5.0, vous n'avez pas nécessairement besoin de créer des exceptions supplémentaires:
En outre, vous pouvez couvrir plusieurs scénarios avec une seule exception intégrée et vous avez plus de contrôle.
Voir plus:
la source
Réécrivez la signature de votre méthode afin qu'elle accepte
HttpServletResponse
comme paramètre, afin que vous puissiez l'appelersetStatus(int)
.http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments
la source
setStatus(int)
javadoc déclare comme suit: Si cette méthode est utilisée pour définir un code d'erreur, le mécanisme de page d'erreur du conteneur ne sera pas déclenché. S'il y a une erreur et que l'appelant souhaite invoquer une page d'erreur définie dans l'application Web, ellesendError
doit être utilisée à la place.Je voudrais mentionner qu'il y a une exception (pas seulement) pour 404 par défaut fournie par Spring. Voir la documentation Spring pour plus de détails. Donc, si vous n'avez pas besoin de votre propre exception, vous pouvez simplement le faire:
la source
@PathVariable
il n'y a pas de traitement de demande de mon point de vue. Pensez-vous qu'il est préférable / plus propre d'utiliser votre propre exception annotée@ResponseStatus(value = HttpStatus.NOT_FOUND)
?Depuis Spring 3.0.2, vous pouvez renvoyer ResponseEntity <T> à la suite de la méthode du contrôleur:
(ResponseEntity <T> est une annotation plus flexible que @ResponseBody - voir une autre question )
la source
vous pouvez utiliser @ControllerAdvice pour gérer vos exceptions. Le comportement par défaut de la classe annotée @ControllerAdvice aidera tous les contrôleurs connus.
il sera donc appelé lorsqu'un contrôleur dont vous disposez lance une erreur 404.
comme ceci:
et mappez cette erreur de réponse 404 dans votre web.xml, comme suit:
J'espère que cela pourra aider .
la source
Si votre méthode de contrôleur est pour quelque chose comme la gestion de fichiers, alors
ResponseEntity
c'est très pratique:la source
Bien que la réponse marquée soit correcte, il existe un moyen d'y parvenir sans exception. Le service renvoie
Optional<T>
l'objet recherché et est mappé àHttpStatus.OK
s'il est trouvé et à 404 s'il est vide.la source
Je recommanderais de lancer HttpClientErrorException , comme ceci
Vous devez vous rappeler que cela ne peut être fait qu'avant que quoi que ce soit ne soit écrit dans le flux de sortie du servlet.
la source
Whitelabel Error Page \n .... \n There was an unexpected error (type=Internal Server Error, status=500). \n 404 This is your not found error
C'est un peu tard, mais si vous utilisez Spring Data REST il existe déjà
org.springframework.data.rest.webmvc.ResourceNotFoundException
Il utilise également des@ResponseStatus
annotations. Il n'est plus nécessaire de créer une exception d'exécution personnalisée.la source
De plus, si vous souhaitez renvoyer l'état 404 de votre contrôleur, tout ce dont vous avez besoin est de le faire
En faisant cela, vous recevrez une erreur 404 au cas où vous voudriez renvoyer un 404 de votre contrôleur.
la source
Vous pouvez simplement utiliser web.xml pour ajouter un code d'erreur et une page d'erreur 404. Mais assurez-vous que la page d'erreur 404 ne doit pas se trouver sous WEB-INF.
C'est le moyen le plus simple de le faire, mais cela a certaines limites. Supposons que si vous souhaitez ajouter le même style pour cette page que vous avez ajouté d'autres pages. De cette façon, vous ne pouvez pas faire ça. Vous devez utiliser le
@ResponseStatus(value = HttpStatus.NOT_FOUND)
la source
HttpServletResponse#sendError(HttpServletResponse.SC_NOT_FOUND); return null;
partir du code du contrôleur. De l'extérieur, la réponse ne ressemble pas à une 404 normale qui n'a touché aucun contrôleur.Configurer web.xml avec le paramètre
Créer un nouveau contrôleur
la source
Parce qu'il est toujours bon d'avoir au moins dix façons de faire la même chose:
la source