2012-04-17 9 views
13

Ho un fagiolo @SessionScoped @Named con un metodo @Producer per un oggetto utente:CDI dipendenze ambigui

@Named @SessionScoped 
public class UserBean implements Serializable 
{ 
    //... 
    @Named @Produces @LoggedIn @SessionScoped 
    public MyUser getCurrentUser() {return user;} 
} 

Questo funziona bene nel mio setup (JBoss-7.1.1-Finale) e non è un problema per accedere l'utente campi da pagine JSF con #{currentUser.name}. Il qualificatore è org.jboss.seam.security.annotations.LoggedIn. Ora voglio @Inject questo utente in un campo di un'altra @Named Bean:

@Named 
public class FavBean implements Serializable 
{ 
    private @Inject @LoggedIn MyUser currentUser; 
} 

Questo mi dà l'errore:

org.jboss.weld.exceptions.DeploymentException: 
WELD-001409 Ambiguous dependencies for type [MyUser] with qualifiers [@Default] at 
    injection point [[field] @Inject @LoggedIn test.FavBean.currentUser]. 
Possible dependencies [[Managed Bean [class test.ejb.MyUser] with qualifiers 
    [@Any @Default], 
Producer Method [MyUser] with qualifiers [@Any @Default] declared as [[method] 
    @Named @Produces @LoggedIn @SessionScoped public test.UserBean.getCurrentUser()]]] 

Non capisco la prima dipendenza Managed Bean [class test.ejb.MyUser] Questa classe è un semplice @Entity e distribuito in un ebb.jar in un EAR. Come soluzione temporanea, sto attualmente iniettando il per ottenere l'utente da lì.

risposta

22

Questo perché CDI cerca fagioli per tipologia e l'entità ed il metodo produttore ritorno dello stesso tipo. Ecco perché è ambiguo.

è necessario definire una nuova qualificazione e annotare con il vostro metodo produttore.

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface CurrentUser { 
} 

Aggiungi questa annotazione al metodo produttore:

@Named @Produces @CurrentUser @LoggedIn @SessionScoped 
public MyUser getCurrentUser() {return user;} 
+1

Oppure modificare l'annotazione 'LoggedIn' aggiungendo' Qualificatore' ad esso. Sembra che non abbia 'Qualifier'. –

3

Ho avuto problemi molto simili, e ho avuto un po 'di aiuto in linea. Il mio problema era che dov'era il mio servizio, era incluso in un orecchio distribuito e nel mio progetto web. È stata una duplicazione accidentale, è stata eliminata e funzionerà anche se è il tuo caso.

qui sulla figura seguente ho avuto l'esb_khr all'interno del esb_khr_web, ho rimosso. In eclissi: vai alle proprietà e all'assembly di distribuzione.

enter image description here

2

io non sono un esperto, ma ho avuto un problema simile, e mi fissa in modo più semplice, annotando il fagiolo se con @Alternative, in modo che il produttore è favorito. Potrebbe essere che mi mancano alcuni effetti collaterali, ma questo ha funzionato per quanto ho potuto vedere/necessario.