2009-01-20 13 views
16

Jeśli w mojej warstwie biznesowej występuje wyjątek (np. Wyjątek SQL w moim komponencie bean połączenia JDBC), w jaki sposób mogę go propagować z niestandardowym komunikatem do globalnej strony error.jsp?Ogólna obsługa wyjątków JSF 1.x

Odpowiedz

3

Ogólnym sposobem wyświetlania komunikatu o błędzie do użytkownika w JSF jest użycie FacesMessage:

Na stronie Java:

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

i JSF (JSP lub XHTML) stronie, wystarczy użyć <h:messages/> element na twojej stronie, aby wyświetlić błąd.

19

JSF 1.x nie dostarcza żadnych niejawny obsługę błędów tego typu, choć można przekierować na stronę błędu, stosując zasady nawigacji (zakładając tworzą 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> 

... lub za pomocą przekierowania ...

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

Polecam patrząc na JSF specification więcej szczegółów.

Komunikaty o błędach można umieszczać w zakresie żądań/zakresie sesji/parametrach URL, zgodnie z własnymi upodobaniami.


Zakładając kontener serwletów, można użyć zwykłej web.xml error page configuration.

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

W swojej podkładowej fasoli, można owinąć i rzucać sprawdzonych wyjątków w RuntimeException s.

Niektóre implementacje/frameworki JSF wychwycą te błędy (Apache MyFaces/Facelets), więc będziesz musiał configure them not to.

+0

był to doskonała odpowiedź, chciałbym dać ci 10 punktów za twoją odpowiedź. –

1

Można umieścić

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

w jour JSP/JSF stronie. W error.jsp, by mieć jou:

<%@ page isErrorPage="true" %> 

isErrorPage = „true” poda swoją stronę innego niejawny obiektu: wyjątek (w ten sam sposób masz już wniosek i odpowiedzi na stronie JSP). Następnie można wyodrębnić wiadomość z wyjątku.

Additional details

6

Zrobiłem stronę błędu w stronach strony i umieścić stacktrace błędu Ten kod najpierw umieścił go w Internecie.xml

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

Choć strona JSF miał ten kod

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

pamiętać, że motyw umożliwia debugowanie StackTrace dla reazon wiedzieć, co jest wyjątkiem w polu ukrytym. Zobaczmy jak klasa jest zdefiniowana odzyskuje 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); 
      } 
     } 
    } 
} 

i już przywiązany jak zakończyć tę definicję fasoli w facesconfig plików

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

I mam nadzieję, że będzie to służyć