2012-02-29 9 views
5

voglio solo stampare un messaggio personalizzato su una pagina di errore, quando si verifica un'eccezione.gestione eccezioni in jsf - per stampare il messaggio di errore nella nuova pagina

Ho provato questo

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

    } 

In error.xhtml ho dato il tag

<h:messages></h:messages> 

troppo .. ogni volta che si verifica l'eccezione mia pagina è stata reindirizzata perfettamente. ma non ho alcun messaggio di errore.

+0

Eventuali duplicati: [? Come visualizzare gli errori della mia applicazione in JSF] (http://stackoverflow.com/questions/315804/how-to-display-my-applications-errors-in-jsf) – oers

+0

no no, quella domanda riguarda gli errori di convalida msgs, sto chiedendo informazioni sulla gestione delle eccezioni in cui ho bisogno di reindirizzare a un'altra pagina per stampare il mio messaggio personalizzato. Ma non avviene alcun reindirizzamento in quella domanda ... non ho problemi a stampare un messaggio di convalida nella stessa pagina .. il problema esiste principalmente nel reindirizzamento a quanto pare .. – Karthikeyan

risposta

8

I messaggi di facce sono richiesti con scope. Un reindirizzamento richiede fondamentalmente al browser di inviare una richiesta HTTP nuova di zecca (questo è anche il motivo per cui l'URL viene modificato nella barra degli indirizzi del browser). I messaggi volti che sono impostati nella richiesta precedente non sono ovviamente più disponibili nella nuova richiesta.

Ci sono diversi modi per farlo funzionare:

  1. Non inviare un reindirizzamento. Invia un forward invece. Puoi farlo da ExternalContext#dispatch()

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

    o semplicemente navigando il solito modo se siete già all'interno di un metodo di azione

    return "error"; 
    
  2. creare una pagina di errore comune modello principale e utilizzare i clienti dei modelli separati per ogni singolo tipo di errore e metti invece il messaggio nella 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> 
    

    allora si può solo reindirizzare a questa pagina di errore specifica in questo modo redirect("error-login.xhtml").

  3. Passa un identificatore di errore come parametro di richiesta tramite l'URL di reindirizzamento come in questo modo redirect("error.xhtml?type=login") e lascia che sia la vista a gestirlo.

    <h:outputText value="You must login to continue." rendered="#{param.type == 'login'}" /> 
    
  4. Mantenere i messaggi dei volti nella portata del flash.

    externalContext.getFlash().setKeepMessages(true); 
    

    Mojarra ha tuttavia un'implementazione di ambito flash un po 'buggata. Con le versioni correnti, questo non funzionerà quando è necessario reindirizzare a una cartella diversa, ma funzionerà quando la pagina di destinazione si trova nella stessa cartella.

+0

Adesso tutto funziona bene, ma wat ha a che fare con questa eccezione .. 'Impossibile chiamare sendRedirect() dopo il commit della risposta'. – Karthikeyan

+1

Apparentemente qualche altro codice più in basso nella catena di chiamate sta anche chiamando 'sendRedirect()' (o 'externalContext.redirect()' che sta delegando allo stesso metodo sotto le copertine). Dovresti saltare quella chiamata. Vedi anche questa risposta correlata per alcuni suggerimenti: http: // StackOverflow.com/domande/2123514/java-lang-IllegalStateException-can not-forward-dopo-risposta-è-stato-Comitato/2.125.045 2.125.045 # – BalusC

Problemi correlati