2011-02-04 20 views
11

Digamos que tengo una aplicación que administra usuarios. Se pueden añadir nuevos usuarios, eliminarlos, editar detalles etc. Cada usuario tiene na Identificación y tiene la página de detalles de URL como esta:Cómo "arrojar" error JSF2 404?

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

Ahora, lo que debería suceder si 123 no existe usuario con ID? Creo que la reacción natural sería un error estándar 404. Exactamente lo mismo que se supera cuando se genera un error tipográfico en la URL (como /user/dtail.jsf). Entonces la pregunta es: ¿hay tal método?

¿O tal vez sea esta reacción (404) apropiada?

Gracias.

Respuesta

13

Simplemente adjunte un validador al parámetro id id y si la validación falla, configure el código de error 404 en la respuesta.

p. Ej.

consideran este sencillo 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> 

Y el siguiente bean de respaldo:

@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

En JSF2 hay ['ExternalContext # setResponseStatus()'] (http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#setResponseStatus%28int%29). No hay necesidad de lanzar más! :) Hay por cierto también es un [ 'ExternalContext # responseSendError()'] (http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#responseSendError%28int,%20java .lang.String% 29). – BalusC

+0

Bien, en realidad escaneé a través de la lista de métodos en ExternalContext, pero no lo pude ver. ¡Gracias! Se actualizó la respuesta ya que esta es la solución más directa. –

+0

@BalusC: Gracias, eso era exactamente lo que necesitaba. – Tomik

1

(terminé aquí en busca de algo similar, pero aquí hay otro patrón que utilicé en un problema similar)

La respuesta de Validación/ExternalContext anterior es una muy buena manera de manejarlo, alternativamente (ya que está al listo dentro del contexto) puede manejar el error al analizar los parámetros de la solicitud y tratarlos internamente. Creo que es más de lo que desea manejar en su flujo de un "aquí es una solución mejor"

//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 Fuente (something.xhtml) ... ...

Creo que lo anterior es generalmente más fácil de trabajar dentro del marco (no tiene que enviar a una página de error e interrumpir el flujo), pero en realidad es simplemente una decisión arquitectónica. Ambas soluciones son similares, solo se trata de interrumpir el flujo o el manejo interno. De cualquier manera, ExternalContext es tu amigo.

1

Como se mencionó, puede obtener el contexto dentro de un bean administrado. Probé el enfoque del validador, pero para mí no era aplicable ya que estaba usando dos parámetros para inicializar mi bean, y quiero arrojar un 404. Para mí, el .setResponseStatus no arrojó la página 404. Acabo de dar una página de navegador no informativa. Así que usé el responseSendError en su lugar.

+0

Ayudame más porque muestra la página de error. Solo para completar, aquí está el código: ((HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext(). getResponse()). sendError (HttpServletResponse.SC_NOT_FOUND); – James