2012-03-07 9 views
6

Sto tentando di @Inject un fagiolo @SessionScoped in un filtroUtilizzando CDI iniezione in una Servlet

@WebFilter("/*") 
public class IdentityFilter implements Filter, Serializable { 

    @Inject 
    private LoginUser loginUser; 
... 

dove LoginUser è @SessionScoped

L'intenzione è per LoginUser per rappresentare l'utente connesso per la sessione.

Il problema è che sembra che non sto ottenendo sempre il loginUser dalla sessione corrente, io sono sempre 'perdite' tra le sessioni come oggetto LoginUser una sessione viene condivisa con un'altra sessione. Ovviamente non va bene.

Mi chiedo se questo è dovuto al fatto che l'oggetto Filter è un singleton o almeno riutilizzato tra le richieste e le sessioni dal contenitore (glassfish). (Destra?)

Esiste un modo migliore per ottenere l'oggetto LoginUser per la sessione corrente senza utilizzare una proprietà sul filtro?

+0

Potresti incollare il codice LoginUser? Se non hai un costruttore non privato senza parametri o la classe è definitiva o hai un metodo finale, non funzionerà. –

+0

Grazie Fabricio. Penso che sia ok, si inietta così deve essere. Il problema è la condivisione ... Penso di aver trovato ciò che è sbagliato, posterò. – Jonathan

risposta

8

Il mio problema è che esiste solo un'istanza del filtro nel contenitore, in pratica un singleton. Sembra che CDI inietta il primo oggetto a livello di sessione nel filtro al primo utilizzo e quindi il filtro memorizza tale riferimento per sempre, anche per altre sessioni.

ho trovato questa soluzione, per iniettare un oggetto di fabbrica (Instance), che posso usare per ottenere l'istanza sessione ogni volta che il filtro viene eseguito, cioè

@WebFilter("/*") 
public class IdentityFilter implements Filter, Serializable { 

     @Inject 
     private Instance<LoginUser> loginUserSource; 

E in

@Override 
public void doFilter(...) 
     LoginUser login = loginUserSource.get(); 

Questo sembra risolvere il mio problema.

Grazie

+4

In realtà, CDI funziona utilizzando i proxy e non è l'istanza LoginUser effettiva che viene iniettata finché non ha l'ambito dipendente e soddisfa i requisiti del mio primo commento. –

+2

+1 alla risposta di Fabricio Lemos. CDI fornisce proxy. Questo è richiesto dalle specifiche CDI (per tutti i bean NormalScoped). Assicurati che il @SessionScoped che utilizzi sia effettivamente quello CDI (javax.enterprise.context.SessionScoped) e NON ad es. quello di JSF (java.faces.bean.SessionScoped). Questo è un errore comune e si verifica se l'IDE importa automaticamente l'annotazione dal pacchetto sbagliato. Questi ambiti JSF sono considerati legacy dall'EE6 e potrebbero persino essere deprecati nelle future versioni di JSF. – struberg