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...
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.
Hmm exception.getMessage()
devrait fonctionner
Essayez d'ajouter exception.getClass().getName()
NullPointerException
qui n'a pas de message- 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
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.
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 javadocsendError
HttpServletResponse
. 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.
La chose que vous voulez un peu bizarre pour moi :). Cela dit, je ferai ce qui suit:
implémenter
HttpResponseWrapper
pour envelopper un autreHttpResponse
de cette manière:public class HttpResponseWrapper implements HttpResponse { private String errorMessage; ... @Override public void sendError(...) { <save error message here> } ... }
Créer un Filtre et l'enrouler tout de réponse dans ce
Mettre un filtre sur toutes les demandes et le premier dans la chaîne
dans votre page d'erreur, vérifiez si la réponse est instanceof
HttpResponseWrapper
obtenez votre message
Vous pouvez utiliser
${requestScope['javax.servlet.error.message']}
si vous n'avez pas de jstl sur la page