Обработка исключений в JSF 1.x - PullRequest
16 голосов
/ 20 января 2009

Если у меня есть исключение на моем бизнес-уровне (например, исключение SQL в моем компоненте соединения JDBC), как я могу распространить его с помощью специального сообщения на глобальную error.jsp страницу?

Ответы [ 6 ]

19 голосов
/ 20 января 2009

JSF 1.x не обеспечивает никакой неявной обработки ошибок этого типа, хотя вы можете перенаправить на страницу с ошибкой, используя правила навигации (при условии публикации в форме) ...

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

... или с помощью перенаправления ...

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

Я рекомендую ознакомиться со спецификацией JSF для получения более подробной информации.

Сообщения об ошибках могут быть помещены в параметры области запроса / области сеанса / URL, как вам нравится.


В предположении контейнера сервлета вы можете использовать обычную конфигурацию страницы ошибки web.xml .

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

В вашем компоненте поддержки вы можете обернуть и выбросить проверенные исключения в RuntimeException s.

Некоторые реализации / инфраструктуры JSF будут ловить эти ошибки (Apache MyFaces / Facelets), поэтому вам придется настроить их, а не .

8 голосов
/ 30 апреля 2010

JSF 2 теперь имеет механизм для обработки исключений:

http://java.sun.com/javaee/6/docs/api/javax/faces/context/ExceptionHandler.html

6 голосов
/ 29 апреля 2011

Я сделал страницу с ошибками в лицах сайта и выложил трассировку стека ошибок Этот код сначала поместил его в web.xml

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

Пока на странице jsf был этот код

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

Обратите внимание, что мотив позволяет отлаживать трассировку стека для получения сведений о том, что является исключением в скрытом поле. Давайте посмотрим, как определяется класс восстанавливает 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);
            }
        }
    }
}

и уже присоединен, когда вы заканчиваете это определение bean-компонента в файлеfaceconfig

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

И я надеюсь, что это послужит

3 голосов
/ 20 января 2009

Общий способ отображения сообщения об ошибке для пользователя в JSF заключается в использовании FacesMessage:

На стороне Java:

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

и на странице JSF (JSP или XHTML) просто используйте компонент <h:messages/> на своей странице, чтобы отобразить ошибку.

1 голос
/ 02 февраля 2011

Я пришел к той же проблеме и нашел ссылку, описывающую, как вы можете использовать ExceptionHandler в JSF2:

http://jugojava.blogspot.com/2010/09/jsf-2-exception-handling.html

1 голос
/ 24 января 2009

Можно поставить

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

в журнале JSP / JSF странице. В error.jsp у jou будет:

<%@ page isErrorPage="true" %>

isErrorPage = "true" даст вашей странице еще один неявный объект: исключение (так же, как у вас уже есть запрос и ответ на странице jsp). Затем вы можете извлечь сообщение из исключения.

Дополнительные детали

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...