2012-04-17 21 views
13

que tienen un grano @SessionScoped @Named con un método @Producer para un objeto de usuario:CDI dependencias ambiguas

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

Esto funciona bien en mi configuración (JBoss-7.1.1-final) y no hay problema para acceder el usuario campos de páginas JSF con #{currentUser.name}. El calificador es org.jboss.seam.security.annotations.LoggedIn. Ahora quiero @Inject este usuario en un campo de otra @Named Bean:

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

Esto me da el error:

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()]]] 

No entiendo la primera dependencia Managed Bean [class test.ejb.MyUser] Esta clase es un simple @Entity y desplegado en ebb.jar en un EAR. Como solución alternativa, actualmente estoy inyectando el UserBean y obtengo el usuario desde allí.

Respuesta

22

Esto se debe a que CDI busca beans por tipo y su entidad y el método de productor devuelven el mismo tipo. Es por eso que es ambiguo.

Debe definir un nuevo calificador y anotarlo con su método de productor.

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

Añadir esta anotación a su método de productor:

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

O modifique la anotación 'LoggedIn' agregando' Calificador' a ella. Parece que no tiene 'Calificador'. –

3

tuve problema muy similar, y me dieron un poco de ayuda en línea. Mi problema era que donde estaba mi servicio, estaba incluido en una oreja desplegada Y en mi proyecto web también. Fue una duplicación accidental, elimine una, y funcionará si es su caso también.

aquí en la siguiente imagen tuve el esb_khr dentro de esb_khr_web, lo eliminé. En eclipse: vaya a propiedades y ensamblaje de implementación.

enter image description here

2

no soy un experto, pero tuve un problema similar, y me fijo en forma más simple, anotando el grano en sí con @Alternative, de manera que se favorece el productor. Podría ser que me faltan algunos efectos secundarios, pero esto funcionó tanto como pude ver/necesitar.