Comment gérer les exceptions levées du rendu d'une vue dans Spring MVC?
J'ai un Spring MVC de l'application qui utilise FreeMarker de Vue de la technologie (Mais peut-être la technologie d'affichage n'a pas vraiment d'importance pour ma question). J'ai besoin d'intercepter toutes les exceptions qui peuvent être lancé lors d'une requête.
J'ai mis en place un HandlerExceptionResolver mais cette résolution n'est exécuté lorsque l'exception se produit au sein d'un contrôleur. Mais quand un contrôleur retourne une ModelAndView et de l'exception se produit alors que le rendu de la vue (Parce qu'une variable n'a pas été trouvé ou quelque chose comme cela), alors l'exception de résolution n'est pas appelé et à la place je reçois une trace de la pile dans la fenêtre du navigateur.
J'ai aussi essayé d'utiliser un gestionnaire d'exception de la méthode dans le contrôleur qui retourne la vue et annoté avec @ExceptionHandler mais cela ne fonctionne pas (Plus probablement à nouveau parce que l'exception n'est pas jeté dans le contrôleur, mais dans la vue).
Donc est-il un mécanisme à Ressort où je peux enregistrer un gestionnaire d'exception qui capture d'afficher les erreurs?
- Serait-ce configuration de l'aide?
- Non, malheureusement pas. Cet article explique simplement l'utilisation de la HandlerExceptionResolver choses. C'est ce que j'ai déjà utiliser, mais il ne saisit les exceptions levées dans les contrôleurs, pas dans les vues.
Vous devez vous connecter pour publier un commentaire.
Un mot à l'avance: si vous avez juste besoin d'un "statique" page d'erreur sans beaucoup de logique et de préparation du modèle, il suffit de mettre un
<error-page>
-Balise dans votreweb.xml
(voir ci-dessous pour un exemple).Sinon, il pourrait y avoir de meilleures façons de le faire, mais cela fonctionne pour nous:
Nous utilisons une servlet
<filter>
dans leweb.xml
que les captures de toutes les Exceptions et les appels de notre coutume ErrorHandler, les mêmes que nous utilisons à l'intérieur du Printemps HandlerExceptionResolver.La mise en œuvre semble essentiellement comme ceci:
Je crois que cela devrait fonctionner à peu près la même pour FreeMarker modèles. Bien sûr, si votre erreur vue renvoie une erreur, vous êtes plus ou moins d'options.
Pour la capture des erreurs de ce type 404 et préparer le modèle pour cela, nous utilisons un filtre qui est mappé à la
ERROR
répartiteur:La doFilter-mise en Œuvre ressemble à ceci:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'defaultErrorHandler' is defined
sur l'init. Ai-je besoin de définir ce dans un servlet.xml ?request.getRequestDispatcher("/WEB-INF/jsp/error/dispatch-error.jsp").forward(request, response);
à l'aide d'un existant ViewResolver?Vous pourrait s'étend de la DispatcherServlet.
Dans votre web.xml remplacer le générique DispatcherServlet pour votre propre classe.
Plus tard de créer votre propre classe DispatcherServletHandler et s'étend de la DispatcherServlet:
Et dans cette page, nous n'avons qu'à afficher un message à l'utilisateur.
Ne sais pas si ma solution fonctionne avec le problème que vous rencontrez. Malade juste après, la façon dont j'attrape mon exceptions pour s'assurer qu'aucune trace de la pile est de montrer à l'intérieur du navigateur:
J'ai fait un AbstractController classe avec une méthode qui va gérer un conflit en particulier comme ceci:
De cette façon, lorsqu'une exception se produit, l'utilisateur verra une HTTPResponse état. (eg. 404 not Found etc..)
J'étends cette classe sur tous mes classes de contrôleur à assurez-vous que les erreurs sont redirigés vers la AbstractController. De cette façon, je n'ai pas besoin d'utiliser ExceptionHandler sur un contrôleur spécifique, mais je peux ajouter l'globalement à tous mes contrôleurs. (par extension de la AbstractController classe).
Edit:
Après un autre rendez-vous sur votre question, j'ai remarqué que vous obtenez des erreurs dans votre vue. Vous ne savez pas si cette façon de rattraper cette erreur..
Espérons que cette aide!!