2010-11-29 17 views
5

¿Es posible obtener una referencia al beans gestionados a ejecutar en el before-invoqueApplication-phaselistener?JSF 2: ¿Accediendo a la instancia del bean administrado en el objeto detector de fase?

Antes de la fase de solicitud de invocación, debe quedar claro qué managedBean va a ejecutar el método.

Por el bien del ejemplo, suponga que hay 1 bean de administración principal para manejar 1 página de jsf.

Así que lo que necesito es básicamente:

  1. El usuario acceder al programa desde el menú
  2. Debido a que se accede desde el menú, el principal gestionar el método de frijol init() obtiene la llamada para inicializar materias como la preparación de de datos, haciendo autorización comprueba
  3. somete posteriores no necesita llamar al método init() nunca más hasta que se reaccessed en el menú

para implementar el punto # 2, estoy pensando en interceptar una de las fases

He comprobado los documentos de la API sobre cómo obtener el bean administrado en la implementación de las fases, pero parece que no puedo encontrar ninguno.

Después de escribir esta pregunta, me doy cuenta de que podría hacer esto en @PostConstruct o en el constructor del bean administrado, pero eso sería solo la primera vez que se construye el bean, y necesito llamar al método cada vez que jsf siendo accedido desde el menú.

¿Alguna sugerencia?

Saludos,
Albert Kam

Respuesta

3

Puede acceder a los beans gestionados a través de la ELContext/ELResolver. Esto se explica muy bien en el MyFaces wiki (también funciona en JSF vanilla).

Por ejemplo:

ELContext elContext = FacesContext.getCurrentInstance().getELContext(); 
NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication() 
    .getELResolver().getValue(elContext, null, "neededBean"); 

Véase el MyFaces wiki entry para una explicación más detallada, y las implementaciones para otras versiones JSF.

Su idea de usar @PostConstruct es buena. Considere cambiar su alcance a algo que le gusta @ViewScoped, por lo que la lógica se ejecuta cada vez que navega hacia esa vista.

Además, eche un vistazo a PreRenderViewEvent (para JSF 2). Este código está incrustado en su página de facelet:

<f:metadata> 
<f:viewParam name="foo" value="#{bean.foo}"/> 
<f:event type="preRenderView" listener="#{bean.doSomething}"/> 
</f:metadata> 

El oyente f: event se ejecuta antes de cada vista de página.

+0

Wow, muchas opciones. Gracias ! – bertie

+1

No veo cómo devuelve exactamente la instancia que se ha involucrado en el método de acción. Su enfoque requiere que el nombre del frijol ya se conozca de antemano. Por cierto, prefiero la ['Application # evaluateExpressionGet()'] (http://download.oracle.com/javaee/6/api/javax/faces/application/Application.html#evaluateExpressionGet%28javax.faces.context .FacesContext,% 20java.lang.String,% 20java.lang.Class% 29) abreviatura en lugar de 'ELResolver/ELContext'. Ver también [esta respuesta] (http://stackoverflow.com/questions/2633112/jsf-get-managed-bean-by-name). – BalusC

+0

Bueno, si su oyente de fase está escuchando en la fase de solicitud de invocación anterior, entonces el oyente de fase instanciará la instancia del objeto. Se hará referencia a esta misma instancia en el método de aplicación (que se invoca durante la fase de solicitud de invocación), ya que el estado administrado aún está en el alcance (la misma solicitud). Respondí a la pregunta de cómo hacerlo, pero no lo defiendo como la mejor solución. Proporcioné alternativas que parecen más adecuadas para lograr el objetivo final. –

Cuestiones relacionadas