2010-12-19 12 views
8

Me pregunto si es posible observar un evento CDI con varios beans de respaldo con ámbito de sesión JSF 2.0. Pensé que podía enviar eventos/datos a múltiples sesiones observando el evento.Hacer eventos CDI observados en la sesión de beans de respaldo JSF con ámbito

He configurado una pequeña prueba que permite al usuario disparar el evento usando un botón en la página (que está vinculado a un método en el bean de respaldo con ámbito de sesión que realmente dispara el evento). Pensé que si abría dos navegadores diferentes, se crearían dos sesiones y el evento notificaría a cada uno de los beans de respaldo de la sesión.

Sin embargo, al ejecutar mi pequeña prueba y hacer clic en el botón para iniciar el evento en uno de los navegadores, veo que el evento solo notifica a uno de los beans de ámbito de la sesión. Solo notifica al bean desde el que se activó el evento (es decir, si hago clic en el botón del navegador 1 se notifica a la sesión bean backing de la sesión en el navegador 1 y si hago clic en el botón del navegador 2 el bean respalda la sesión el navegador 2 es notificado).

Tenía la impresión de que los eventos notificarían todas las instancias de beans. Sin embargo, este no parece ser el caso. Debería ser capaz de hacer esto? ¿Tengo algo mal configurado?

ACTUALIZACIÓN para mostrar lo que se ve mi código como:

Un fragmento de jsfpage.xhtml para disparar un evento y mostrar los datos de ámbito de sesión:

 <h:form> 
      <h:outputText value="#{BackingBean.property}" /> 
      <p:commandButton value="Fire Event" action="#{EventFirer.fireEvent}" /> 
     </h:form> 

La Sesión -scoped bean que recibe el evento:

 
@Named 
@SessionScoped 
public class BackingBean implements Serializable { 

    private String property; 

    public String getProperty() { 
     return property 
    } 

    public void listenForChange(@Observes EventObj event) { 
     logger.log(Level.INFO, "Event received"); 
     property = event.toString(); 
    } 
} 

Una aplicación en el ámbito de frijol para disparar el evento:

 
@Named 
@ApplicationScoped 
public class EventFirer implements Serializable { 

    @Inject 
    private Event events; 

    public String fireEvent() { 
     logger.log(Level.INFO, "Event fired"); 
     events.fire(new EventObj()); 
     return null; 
    } 
} 
+0

Debe agregar su código, Capitán. –

+0

¿Alguna vez encontró una solución? Intento hacer lo mismo y quiero enviar datos a todos mis beans '@ SessionScoped'. – Reitffunk

Respuesta

1

En primer lugar, es mejor que especifica el tipo de evento:

@Inject 
private Event<EventObj> events; 

Aparte de eso no hay ninguna indicación en la especificación que limitaría las instancias de frijol sobre las cuales se invoca el método de observador. Me gustaría presentar un problema sobre esto (en el rastreador de errores de la implementación que está utilizando. ¿Quizás Weld?)

+0

No puedo obtener un bean javax.enterprise.context.SessionScoped para observar los eventos activados por un bean javax.enterprise.context.ApplicationScoped. Se emite una excepción: WELD-001303 No hay contextos activos para el tipo de alcance javax.enterprise.context.ConversationScoped. – Steven

0

He encontrado que todos los observadores registrados están despedidos.

Lo más notable es que si tengo un observador en un Bean de Conversation Scoped y ese bean no está activo en la Conversación actual, cuando se dispara el evento, se crea una nueva instancia especialmente para recibirlo.

Cuestiones relacionadas