Comment obtenir le message dans une page d'erreur personnalisée (Tomcat)?

dans JSPs, vous pouvez utiliser response.sendError(int code, String message) pour retourner un code d'erreur particulier (par exemple 404 pour ne pas constaté) et un message. Ces messages s'affichent très bien, tant que vous utilisez les pages d'erreur ugly Tomcat par défaut. Toutefois, si vous créez une page d'erreur personnalisée, comment faire passer le message? J'ai essayé exception.getMessage() ou pageContext.getErrorData() mais sans résultat. J'ai cherché ça pendant des heures et personne ne semble s'interroger sur la même chose! : S

j'ai oublié de mentionner que je ne l'ai essayé avec une erreur 404 alors loin, puisque c'est ce dont j'ai le plus besoin... L'exception est nulle pour une raison quelconque, donc essayer quoi que ce soit sur elle lance une NullPointerException. La page d'erreur est une page d'erreur 404, définie via web.xml (puisque je veux qu'il soit affiché pour chaque erreur 404 simple) et pour quiconque se demande, oui, il a la directive isErrorPage définie à true...

25
demandé sur Lea Verou 2009-06-15 13:46:18

6 réponses

Le message d'erreur est disponible via javax.servlet.error.message attribut de l'objet de la requête dans la page d'erreur jsp.

<c:out value="${requestScope['javax.servlet.error.message']}"/>

vous pouvez rechercher d'autres informations relatives aux erreurs disponibles dans la page d'erreur ici Nouveaux Attributs D'Erreur.

12
répondu Gennady Shumakher 2012-12-26 16:52:41

Hmm exception.getMessage() devrait fonctionner

Essayez d'ajouter exception.getClass().getName()

  1. NullPointerException qui n'a pas de message
  2. ou de l'exception n'est pas de Soleil et le message n'est pas correctement réglé

bien sûr, cela ne fonctionne que, si je me souviens bien, si l'erreur est levée par une jsp <%@ page errorPage="/yourerrorpage.jsp" %> en haut.

si l'erreur provient d'un servlet, les détails de l'exception sont passés en tant que requête les attributs

javax.servlet.error.status_code    java.lang.Integer
javax.servlet.error.exception_type java.lang.Class
javax.servlet.error.message        java.lang.String
javax.servlet.error.exception      java.lang.Throwable
javax.servlet.error.request_uri    java.lang.String
javax.servlet.error.servlet_name   java.lang.String

cochez la case Spécification Des Servlets la section 9.9

9
répondu jitter 2009-06-15 09:58:30

je suis désolé d'avoir répondu si tard, mais j'ai fait face à ce problème il y a juste une semaine, j'ai parcouru beaucoup de sites différents, mais personne n'a vraiment posé ce problème de la façon dont je voulais l'entendre. Dans ce post, j'ai trouvé quelques solutions intéressantes et puis vint jusqu'à mon propre. Il suffit d'inclure cette source dans votre page:

<%
    out.println(pageContext.getErrorData().getRequestURI());
    out.println("<br/>");
    out.println(pageContext.getErrorData().getStatusCode());
    out.println("<br/>");
    out.println(pageContext.getException());
    out.println("<br/>");
%>

cela a parfaitement fonctionné avec moi.

3
répondu russian eagle 2013-04-19 04:44:42

exception de la ErrorData ne sera défini que si la page d'erreur a été chargée à la suite d'une exception et non d'un code d'erreur de réponse.

voir le javadocsendErrorHttpServletResponse. Il mentionne pourquoi vous ne voyez pas le message que vous avez transmis à sendError (l'emphase est mienne):

envoie une réponse d'erreur au client en utilisant le statut spécifié. Par défaut, le serveur crée la réponse pour ressembler à une page d'erreur du serveur formatée en HTML. contenant le message spécifié, paramétrant le type de contenu à "text/html", laissant les cookies et autres en-têtes non modifiés. si une déclaration d'erreur a été faite pour l'application web correspondant au code d'état passé, elle sera servie de préférence au paramètre msg suggéré.



Si la réponse a déjà été donnée, cette méthode déclenche une exception illégale. Après avoir utilisé cette méthode, la réponse doit être considéré comme commis et ne doit pas être écrit.

0
répondu jimr 2009-06-22 18:15:33

La chose que vous voulez un peu bizarre pour moi :). Cela dit, je ferai ce qui suit:

  1. implémenter HttpResponseWrapper pour envelopper un autre HttpResponse de cette manière:

    public class HttpResponseWrapper implements HttpResponse {
        private String errorMessage;
    ...
    
        @Override
        public void sendError(...) {
            <save error message here>
        }
    ...
    }
    
  2. Créer un Filtre et l'enrouler tout de réponse dans ce

  3. Mettre un filtre sur toutes les demandes et le premier dans la chaîne

  4. dans votre page d'erreur, vérifiez si la réponse est instanceof HttpResponseWrapper

  5. obtenez votre message

0
répondu Georgy Bolyuba 2011-11-21 13:39:36

Vous pouvez utiliser

${requestScope['javax.servlet.error.message']}

si vous n'avez pas de jstl sur la page

0
répondu Lê văn Huy 2016-12-25 06:20:00