2011-02-04 10 views
11

Diciamo che ho un'applicazione che gestisce gli utenti. È possibile aggiungere un nuovo utente, eliminarli, Modifica dettaglio ecc Ogni utente ha na ID e ha pagina di dettaglio su URL come questo:Come "lanciare" l'errore JSF2 404?

..../user/detail.jsf?id=123 

Ora, che cosa dovrebbe accadere se l'utente con ID 123 non esiste? Penso che la reazione naturale sarebbe 404 errore standard. Esattamente lo stesso che viene generato quando si digita un errore di battitura nell'URL (come /user/dtail.jsf). Quindi la domanda è: esiste un tale metodo?

O forse questa reazione (404) è appropriata?

Grazie.

risposta

13

Basta allegare un validatore al parametro di visualizzazione ID e se la convalida non riesce, impostare il codice di errore 404 sulla risposta.

ad es.

considerare questo semplice facelet:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

    <f:metadata> 
     <f:viewParam id="id" name="id" value="#{myBean.id}" validator="#{myBean.validate}"/> 
    </f:metadata> 

    <h:body> 

     <h:outputText value="#{myBean.id}"/> 

    </h:body> 

</html> 

E il seguente supporto di fagioli:

@ManagedBean 
@ViewScoped 
public class MyBean { 

    private Long id; 

    public void validate(FacesContext context, UIComponent component, Object object) { 
     // Do some validation 
     // And if failed: 
     context.getExternalContext().setResponseStatus(404); 
     context.responseComplete(); 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

} 
+6

In JSF2 c'è ['ExternalContext # setResponseStatus()'] (http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#setResponseStatus%28int%29). Non c'è più bisogno di lanciare! :) C'è anche un ['ExternalContext # responseSendError()'] (http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#responseSendError%28int,%20java .lang.String% 29). – BalusC

+0

Bello, in realtà ho fatto scorrere l'elenco dei metodi in ExternalContext ma l'ho perso completamente. Grazie! Aggiornato la risposta in quanto questa è la soluzione più semplice. –

+0

@BalusC: Grazie, era esattamente ciò di cui avevo bisogno. – Tomik

1

(ho finito qui alla ricerca di qualcosa di simile, ma ecco un altro modello che ho usato su un problema simile)

La risposta Validation/ExternalContext sopra è un ottimo modo per gestirlo, in alternativa (dato che sei al pronto nel contesto) è possibile gestire l'errore durante l'analisi dei parametri dalla richiesta e gestirla internamente. Penso che è più di come si desidera gestire la cosa nel vostro flusso di un "qui è una soluzione migliore"

//Inside "SomeManagedBean" 
    public String getParam() 
    { 
    String value = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("key"); 
    if(value == null) 
     return "key not Exist"; 
    else 
     return value; 

    } 

// JSF 2.0 Fonte (something.xhtml) ... ...

Penso che in generale sia più facile lavorare con il framework (non è necessario inviare una pagina di errore e interrompere il flusso), ma in realtà è semplicemente una decisione architettonica. Entrambe le soluzioni sono simili, è solo una questione di rompere il flusso o la gestione interna. In entrambi i casi, ExternalContext è tuo amico.

1

Come già detto, è possibile ottenere il contesto da un bean gestito. Ho provato l'approccio del validatore, ma per me non era applicabile dal momento che stavo usando due parametri per inizializzare il mio bean, e voglio lanciare un 404. Per me .setResponseStatus non ha lanciato la 404-page. Ho appena dato una pagina del browser non informativo. Quindi ho usato invece responseSendError.

+0

Aiutami di più perché mostra la pagina di errore. Solo per completare, ecco il codice: ((HttpServletResponse) FacesContext.getCurrentInstance().. GetExternalContext() getResponse()) sendError (HttpServletResponse.SC_NOT_FOUND).; – James