2012-04-17 13 views
13

Ich habe eine @SessionScoped @Named Bohne mit einem @Producer Verfahren für ein Benutzerobjekt:CDI mehrdeutige Abhängigkeiten

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

Dies funktioniert gut in meinem Setup (JBoss-7.1.1-Final) und es ist kein Problem, den Benutzer für den Zugriff auf Felder von JSF-Seiten mit #{currentUser.name}. Der Qualifier ist . Jetzt möchte ich den Benutzer in einem Feld @Inject in einem anderen @Named Bean:

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

Das gibt mir den Fehler:

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

Ich verstehe nicht die erste Abhängigkeit Managed Bean [class test.ejb.MyUser] Diese Klasse ist eine einfache @Entity und in einem ebb.jar in einem EAR eingesetzt. Als Workaround injiziere ich gerade den UserBean Benutzer von dort.

Antwort

22

Dies liegt daran, dass CDI nach Beans nach Typ sucht und Ihre Entität und die Producer-Methode den gleichen Typ zurückgeben. Deshalb ist es mehrdeutig.

Sie müssen ein neues Qualifikationsmerkmal definieren und es mit Ihrer Producer-Methode annotieren.

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

diese Anmerkung zu Ihrem Producer-Methode hinzufügen:

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

Oder ändern Sie 'LoggedIn' Annotation, indem Sie' Qualifier' hinzufügen. Es scheint, dass es nicht "Qualifier" hat. –

3

ich sehr ähnliches Problem hatte, und ich habe einige Offline-Hilfe. Mein Problem war, dass mein Dienst in einem entfalteten Ohr UND in meinem Web-Projekt enthalten war. Es war eine versehentliche Duplizierung, eine fallen, und es wird funktionieren, wenn es auch Ihr Fall ist.

hier auf dem folgenden Bild hatte ich die esb_khr innerhalb der esb_khr_web, ich entfernt. In Eclipse: Gehe zu Eigenschaften und Deployment-Assembly.

enter image description here

2

Ich bin kein Experte, aber ich hatte ein ähnliches Problem, und ich regelte es in einfacher Art und Weise, durch die Bohne selbst mit @Alternative mit Anmerkungen versehen, so dass der Hersteller begünstigt wird. Könnte sein, dass mir einige Nebenwirkungen fehlen, aber das funktionierte so weit ich sehen konnte/brauchte.