10
votes

Spring MVC @ExceptionHandler Méthode obtenez la même vue

Mon problème est que je souhaite créer une méthode @ExceptionHandler qui capturera toutes les exceptions non traitées. Une fois capturé, je voudrais rediriger vers la page actuelle au lieu de spécifier une page séparée juste pour afficher une erreur.

Fondamentalement, comment puis-je obtenir la valeur de aView em> renvoyée par SOMEMETHOD EM> et définissez-la de manière dynamique dans la méthode non andhandexceptionHandler em> ci-dessous. P>

<c:if test="${not empty UNHANDLED_ERROR}">
    <div class="messageError"> ${UNHANDLED_ERROR}</div>
</c:if>


3 commentaires

@ Aaron-Blenkush J'ai fini de travailler à ce sujet, mais dans une demande à un contrôleur-Classe-la-demande, pas avec des méthodes, donc pas sûre si intéressant


Bounty expire bientôt! Cela peut être résolu avec 1-2 lignes de code. À votre santé.


@Aaronblenkush, vous avez donc une réponse? Y a-t-il une chance que vous puissiez le partager? Vraiment envie de regarder ça :)


5 Réponses :


6
votes

Je ne pense pas qu'il existe un moyen de faire ce que vous demandez, car dans la méthode de la manutention d'exception non andhandexceptionHandler code> Il n'y a aucun moyen de déterminer quel nom de la vue de la vue que la méthode du gestionnaire SOMEMETHOD code> serait revenu.

Le seul moyen est que vous introduisiez une sorte de schéma de métadonnées de sorte que lorsque vous vous retrouvez dans le gestionnaire d'exception, vous pouvez déterminer quelle vue pour mapper. Mais je pense que ce régime Meta Data serait assez complexe. Vous pouvez mettre en œuvre un tel schéma en découvrant quelle était l'URL d'origine accédée lorsque l'exception a été lancée, cela peut être effectué avec l'extrait de code ci-dessous. P>

@RequestMapping(value = "/somepage", method = RequestMethod.GET)
public String somemethod(HttpSession session) throws Exception {
    String abc = null;
    if(someCondition) {
        abc.length();
        return "someview";
    } else {
        // do some stuff here.
        return "someOtherView";
    }
}


1 commentaires

Merci. Je suppose que je vais juste devoir rediriger vers une page d'erreur pour l'instant. Je vais juste laisser cette question ouverte pendant quelques jours. Si toujours pas de réponse, je vais simplement l'accepter comme une réponse ..



2
votes

Plutôt que d'envoyer l'erreur sur une page séparée, vous pouvez simplement mettre l'erreur dans l'objet ModelandView. Dans votre cas, vous pouvez simplement mettre l'essai / attraper dans votre méthode de votre contrôleur et renvoyer la même vue, comme:

@RequestMapping(value = "/somepage", method = RequestMethod.GET)
public String somemethod(ModelAndView mv,HttpSession session) throws Exception {
   mv.setViewName("someview");
   try{ 
      String abc = null;
      abc.length();
    } catch(Exception e) {
      mv.addObject("UNHANDLED_ERROR", "UNHANDLED ERROR. PLEASE CONTACT SUPPORT.  "+ex.getMessage());
   }
   return mv;
}


1 commentaires

De cette façon, j'aurais besoin de le faire sur chaque méthode que j'essaie d'éviter.



6
votes

Je ne pense pas que vous puissiez le faire sans modifier toutes les méthodes de votre gestionnaire. Cependant, vous pouvez essayer de le faire dans une «jolie» de manière:

1) Vous pouvez définir votre propre annotation qui acceptera le nom de la vue cible en tant que paramètre (par exemple, @ExceptionView )

2) La prochaine chose à faire est de marquer les méthodes de votre gestionnaire avec elle, par exemple: xxx

3) après cela, vous pouvez faire quelque chose comme ceci dans un gestionnaire d'exception: xxx


0 commentaires

2
votes

Je n'ai pas essayé ceci, mais sur la base de la documentation ici , nous pouvons obtenir l'objet de la demande dans le gestionnaire d'exception. Nous ne pourrons peut-être pas obtenir la vue liée à l'URL. Obtenir la vue de l'URL, et l'état / le modèle de la vue sera la partie délicate. XXX


0 commentaires

0
votes
  1. Créer une méthode de contrôleur annotée avec @RequestMethod ("/ erreur de serveur")
  2. Créer une méthode de contrôleur annotée avec @ExceptionHandler qui sera retour "Forward: / Erreur de serveur";

0 commentaires