2012-02-29 76 views
5

solo quiero imprimir un mensaje personalizado en una página de error, cuando ocurre una excepción.manejo de excepciones en jsf - para imprimir un mensaje de error en la nueva página

Probé este

if(erroroccured){ 
     FacesMessage message=new FacesMessage("You must login to continue"); 
     context.addMessage(null, message); 
     FacesContext.getCurrentInstance().getExternalContext().redirect("error.xhtml"); 

    } 

En error.xhtml Di la etiqueta

<h:messages></h:messages> 

también .. cada vez que se produce la excepción de mi página se ha redirigido a la perfección. pero no tengo ningún mensaje de error

+0

posible duplicado: [? Cómo mostrar los errores de mi aplicación en JSF] (http://stackoverflow.com/questions/315804/how-to-display-my-applications-errors-in-jsf) – oers

+0

no, no es así, esa pregunta trata sobre los errores de validación msgs, estoy preguntando sobre el manejo de excepciones donde tengo que redirigir a otra página para imprimir mi mensaje personalizado. Pero no ocurre ninguna redirección en esa pregunta ... no tengo ningún problema para imprimir un mensaje de validación en la misma página ... existe un problema principalmente en la redirección, parece ... – Karthikeyan

Respuesta

8

Los mensajes de rostros se solicitan con un alcance. Una redirección básicamente instruye al navegador web para que envíe una nueva solicitud HTTP (esa es también la razón por la que ve la URL siendo cambiada en la barra de direcciones del navegador). Los mensajes de rostros que están configurados en la solicitud anterior ya no están disponibles en la nueva solicitud.

Hay varias maneras de conseguir que funcione:

  1. No enviar una redirección. Envía un reenvío en su lugar. Puede hacerlo por ExternalContext#dispatch()

    FacesContext.getCurrentInstance().getExternalContext().dispatch("error.xhtml"); 
    

    o simplemente navegar por la forma habitual si ya estás dentro de un método de acción

    return "error"; 
    
  2. crear una página de plantilla maestra de error común y utilizar clientes de plantillas separadas para cada tipo de error individual y, en cambio, ponga el mensaje en la vista.

    <ui:composition template="/WEB-INF/templates/error.xhtml" 
        xmlns="http://www.w3.org/1999/xhtml" 
        xmlns:ui="http://java.sun.com/jsf/facelets" 
    > 
        <ui:define name="message"> 
         You must login to continue. 
        </ui:define> 
    </ui:composition> 
    

    a continuación, puedes redirigir a esta página de error específico al igual que redirect("error-login.xhtml").

  3. Pase algún identificador de error como un parámetro de solicitud a través de la URL de redirección como redirect("error.xhtml?type=login") y deje que la vista lo maneje.

    <h:outputText value="You must login to continue." rendered="#{param.type == 'login'}" /> 
    
  4. Mantenga los mensajes de caras en el alcance del flash.

    externalContext.getFlash().setKeepMessages(true); 
    

    Sin embargo, Mojarra tiene una implementación de alcance de flash un poco defectuosa. Con las versiones actuales, esto no funcionará cuando necesite redireccionar a una carpeta diferente, pero funcionará cuando la página de destino esté en la misma carpeta.

+0

Todo funciona bien ahora, pero tiene que ver con esta excepción ... 'No se puede llamar a sendRedirect() después de que se haya confirmado la respuesta'. – Karthikeyan

+1

Aparentemente, algún otro código más abajo en la cadena de llamadas también está llamando a 'sendRedirect()' (o 'externalContext.redirect()' que está delegando en el mismo método bajo las cubiertas). Tendría que omitir esa llamada. Consulte también esta respuesta relacionada para obtener algunas sugerencias: http: // stackoverflow.com/questions/2123514/java-lang-illegalstateexception-can not-forward-after-response-has-been-committe/2125045 # 2125045 – BalusC

Cuestiones relacionadas