2009-01-20 8 views
16

Wenn ich eine Ausnahme in meiner Business-Schicht habe (z. B. eine SQL-Ausnahme in meiner JDBC-Verbindungs-Bean), wie kann ich sie mit einer benutzerdefinierten Nachricht an eine globale error.jsp-Seite weitergeben?JSF 1.x generische Ausnahmebehandlung

Antwort

3

Der allgemeine Weg Fehlermeldung an den Benutzer in JSF angezeigt ist Facesmessage zu verwenden:

Auf Java Seite:

... 
if (errorOccurred) { 
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("An error occurred blabla...")); 
} 

und in der JSF (JSP oder XHTML) Seite, verwenden Sie einfach die <h:messages/> Komponente in Ihrer Seite, um den Fehler anzuzeigen.

19

JSF 1.x bietet keine implizite Fehlerbehandlung dieser Art, wenn Sie auf eine Fehlerseite umleiten Navigationsregeln (unter der Annahme einer Form post) ...

<navigation-case> 
<description> 
Handle a generic error outcome that might be returned 
by any application Action. 
</description> 
<display-name>Generic Error Outcome</display-name> 
<from-outcome>loginRequired</from-outcome> 
<to-view-id>/must-login-first.jsp</to-view-id> 
</navigation-case> 

... oder mit einer Umleitung ...

FacesContext context = FacesContext.getCurrentInstance(); 
ExternalContext extContext = context.getExternalContext(); 
String url = extContext.encodeActionURL(extContext 
     .getRequestContextPath() 
     + "/messages.faces"); 
extContext.redirect(url); 

ich empfehle, am JSF specification um weitere Informationen zu suchen.

Je nach Wunsch können Fehlermeldungen für den Anforderungsbereich/Sitzungsumfang/URL-Parameter vergeben werden.


einen Servlet-Container Unter der Annahme, können Sie die üblichen web.xml error page configuration verwenden.

<error-page> 
    <exception-type>java.lang.Exception</exception-type> 
    <location>/errorPage.faces</location> 
</error-page> 

In Ihrem Backing Bean können Sie Ihre geprüfte Ausnahmen in RuntimeException s wickeln und werfen.

Einige JSF-Implementierungen/Frameworks fangen diese Fehler ab (Apache MyFaces/Facelets), also müssen Sie configure them not to.

+0

dies war ein dienen ausgezeichnete Antwort, ich wünschte, ich könnte Ihnen 10 Punkte für Ihre Antwort geben. –

1

können Sie

<%@ page errorPage="error.jsp" %> 

in jour jsp/JSF-Seite gestellt. In error.jsp würde jou haben:

<%@ page isErrorPage="true" %> 

isErrorPage = „true“ wird Ihre Seite eine weitere implizite Objekt geben: Ausnahme (die gleiche Art und Weise Sie bereits Anfrage und Antwort auf jsp Seite haben). Sie können dann eine Nachricht aus der Ausnahme extrahieren.

Additional details

6

Ich machte eine Fehlerseite in den Seitenflächen und legte die StackTrace des Fehlers Dieser Code zuerst in das Web.xml

<error-page> 
       <error-code>500</error-code> 
       <location>/errorpage.jsf</location> 
</error-page> 

Während die JSF-Seite hatte diesen Code

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     > 
<h:head> 
    <h:outputStylesheet name="EstilosOV.css" library="css" /> 
    <!-- <h:outputScript name="sincontext.js" library="scripts"/> --> 

</h:head> 
<h:body > 
<table width="338" border="0" align="center" bordercolor="#FFFFFF"> 

    <tr bgcolor="#1D2F68"> 
     <td colspan="4" height="35" class="TablaHeader2"> PLAN SEGURO</td> 
    </tr> 
    <tr bgcolor="#FDF2AA"> 
    <td colspan="4" class="HeaderExcepcion"> 
     <h:graphicImage library="images" name="errormark.jpg"/> 
     <font size="5px" color="#CC0000" >Error de ejecución</font> 
     </td> 
    </tr> 
    <tr > 
    <td colspan="3" class="anuncioWarning2">Ocurrio un error al realizar la operación, favor de intentarlo nuevamente, si el error aún se presenta, favor de notificarlo a soporte técnico al 5147-31-00 extensión 6893</td> 
    </tr> 
    <tr> 
     <td height="17" colspan="3" class="TablaHeader2"></td> 
    </tr> 

</table> 
    <h:form id="formerror"> 
     <h:inputHidden id="valuestack" value="#{errorDisplay.stackTrace}"></h:inputHidden> 
    </h:form> 
</h:body> 

</html> 

Beachten Sie, dass Motiv können Sie debuggen die Stacktrace für eine reazon wissen, welche die Ausnahme in dem verborgenen Bereich ist. Mal sehen, wie die Klasse definiert ist erholt Stacktrace

public class ErrorDisplay implements Serializable{ 

    private static final long serialVersionUID = 6032693999191928654L; 
    public static Logger LOG=Logger.getLogger(ErrorDisplay.class); 

    public String getContacto() { 
     return ""; 
    } 

    public String getStackTrace() { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     Map requestMap = context.getExternalContext().getRequestMap(); 
     Throwable ex = (Throwable) requestMap.get("javax.servlet.error.exception"); 

     StringWriter writer = new StringWriter(); 
     PrintWriter pw = new PrintWriter(writer); 
     fillStackTrace(ex, pw); 
     LOG.fatal(writer.toString()); 

     return writer.toString(); 
    } 

    private void fillStackTrace(Throwable ex, PrintWriter pw) { 
     if (null == ex) { 
      return; 
     } 

     ex.printStackTrace(pw); 

     if (ex instanceof ServletException) { 
      Throwable cause = ((ServletException) ex).getRootCause(); 

      if (null != cause) { 
       pw.println("Root Cause:"); 
       fillStackTrace(cause, pw); 
      } 
     } else { 
      Throwable cause = ex.getCause(); 

      if (null != cause) { 
       pw.println("Cause:"); 
       fillStackTrace(cause, pw); 
      } 
     } 
    } 
} 

und bereits angebracht, wie Sie diese Bean-Definition in der facesconfig Datei beenden

<managed-bean> 
      <description> 
       Bean que sirve para llenar la especificacion de un error. Stacktrace 
      </description> 
      <managed-bean-name>errorDisplay</managed-bean-name> 
      <managed-bean-class>mx.com.tdc.datos.page.bean.ErrorDisplay</managed-bean-class> 
      <managed-bean-scope>session</managed-bean-scope> 
     </managed-bean> 

Und ich hoffe, dass diese