2010-12-19 15 views
8

Mi chiedo se sia possibile osservare un evento CDI con più bean di supporto con scope sessione JSF 2.0. Ho pensato di poter spingere eventi/dati a più sessioni osservando l'evento.Eventi CDI osservati attraverso bean di supporto JSF con scope di sessione

Ho impostato un test di piccole dimensioni che consente all'utente di attivare l'evento utilizzando un pulsante sulla pagina (che è collegato a un metodo nel bean di supporto dell'ambito della sessione che genera effettivamente l'evento). Ho pensato che se avessi aperto due browser diversi, sarebbero state create due sessioni e l'evento avrebbe notificato ciascuno dei bean di supporto dell'ambito della sessione.

Tuttavia, quando si esegue il mio piccolo test e si fa clic sul pulsante per attivare l'evento su uno dei browser, vedo che l'evento notifica solo uno dei bean con scope di sessione. Notifica solo il bean da cui è stato attivato l'evento (ad esempio, se faccio clic sul pulsante nel browser 1 viene notificato il bean con scope della sessione che supporta la sessione nel browser 1 e se faccio clic sul pulsante nel browser 2 il bean esegue il backup della sessione in browser 2 viene notificato).

Ho avuto l'impressione che gli eventi avrebbero notificato tutte le istanze di bean. Tuttavia, questo non sembra essere il caso. Dovrei essere in grado di farlo? Ho appena installato qualcosa di sbagliato?

UPDATE per mostrare ciò che il mio codice è simile:

un frammento di jsfpage.xhtml a fuoco un evento e mostrare i dati di sessione con ambito:

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

La Sessione fagiolo -scoped che riceve l'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(); 
    } 
} 

Un'applicazione ambito fagiolo per generare l'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

È necessario aggiungere il codice, Capitano. –

+0

Hai mai trovato una soluzione? Sto cercando di fare lo stesso e voglio inviare dati a tutti i miei fagioli '@ SessionScoped'. – Reitffunk

risposta

1

In primo luogo, è meglio specificare il tipo di evento:

@Inject 
private Event<EventObj> events; 

A parte che non v'è alcuna indicazione nelle specifiche che limiterebbe le istanze bean su cui viene richiamato il metodo observer. Presenterei un problema a riguardo (nel bugtracker dell'implementazione che stai utilizzando. Forse Weld?)

+0

Non riesco a ottenere un bean javax.enterprise.context.SessionScoped per osservare gli eventi attivati ​​da un bean javax.enterprise.context.ApplicationScoped. Viene generata un'eccezione: WELD-001303 Nessun contesto attivo per tipo di ambito javax.enterprise.context.ConversationScoped. – Steven

0

Ho scoperto che tutti gli osservatori registrati sono stati licenziati.

In particolare se ho un osservatore su un bean Conversation Scoped e quel bean non è attivo nella Conversazione corrente, quando l'evento viene attivato, viene creata una nuova istanza appositamente per riceverlo!

Problemi correlati