2009-01-20 17 views
16

Si tengo una excepción en mi capa de negocio (por ejemplo, una excepción de SQL en mi grano de conexión JDBC), ¿cómo se puede propagar I con un mensaje personalizado a una página global error.jsp?JSF manejo 1.x excepción genérica

Respuesta

3

La forma más general, para mostrar mensajes de error al usuario en JSF es utilizar FacesMessage:

Por el lado de Java:

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

y en el JSF (JSP o XHTML) página, basta con utilizar el <h:messages/> componente en su página para mostrar el error.

19

JSF 1.x no proporciona ningún control de errores implícito de este tipo, aunque se puede redirigir a una página de error utilizando reglas de navegación (suponiendo un post forma) ...

<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> 

... o el uso de una redirección ...

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

recomiendo mirar en el JSF specification para más detalles.

Los mensajes de error se pueden ubicar en el alcance de la solicitud/parámetros de ámbito de sesión/url, como desee.


Suponiendo un contenedor de servlets, se puede utilizar el habitual web.xml error page configuration.

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

En su bean de respaldo, se puede envolver y lanzar excepciones comprobadas en RuntimeException s.

Algunas implementaciones/frameworks JSF detectarán estos errores (Apache MyFaces/Facelets), por lo que tendrá que configure them not to.

+0

se trataba de una excelente respuesta, me gustaría darte 10 puntos por tu respuesta. –

1

Usted puede poner

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

en jour página JSP/JSF. En error.jsp, Jou tendría:

<%@ page isErrorPage="true" %> 

isErrorPage = "true" le dará a su página de otro objeto implícito: excepción (de la misma manera que ya tiene petición y la respuesta en la página JSP). A continuación, puede extraer el mensaje de la excepción.

Additional details

6

hice una página de error en las caras del sitio y poner el stacktrace del error Este código primero lo puso en la web.xml

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

Si bien la página JSF tenía el código

<?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> 

Nota ese motivo le permite depurar el StackTrace para una reazon saber cual es la excepción en el campo oculto. Vamos a ver cómo la clase se define recupera 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); 
      } 
     } 
    } 
} 

y que ya está fijado como termine esta definición de frijol en el archivo facesconfig

<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> 

y espero que esto sirva

Cuestiones relacionadas