2012-04-17 50 views
13

我有一個@SessionScoped @Named豆與用戶對象@Producer方法:CDI曖昧的依賴關係

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

這在我的設置工作正常(JBoss的7.1.1決賽),它是訪問用戶沒問題來自JSF頁面的字段與#{currentUser.name}。限定符爲org.jboss.seam.security.annotations.LoggedIn。現在我想@Inject該用戶在一個字段在另一個@Named豆:

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

這給我的錯誤:

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

我不明白第一依賴Managed Bean [class test.ejb.MyUser]這個類是一個簡單的@Entity並部署在EAR的ebb.jar中。作爲解決方法,我目前正在注入UserBean從那裏獲取用戶。

回答

22

這是因爲CDI按類型搜索bean,實體和生產者方法返回相同的類型。這就是它含糊不清的原因。

您需要定義一個新的限定符並使用生產者方法對其進行註釋。

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

這個註釋添加到您的製作方法:

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

或者通過向其添加Qualifier來修改'LoggedIn'註釋。看起來它沒有'Qualifier'。 – 2012-04-17 06:46:45

3

我有非常類似的問題,我得到了一些脫機幫助。我的問題是,在我服務的地方,它被包含在已部署的耳朵中以及我的Web項目中。這是一個意外重複,放棄一個,如果它是你的情況,它也會起作用。

這裏關於下面的圖片我有esb_khr裏面的esb_khr_web,我刪除了。在eclipse中:轉到屬性和部署程序集。

enter image description here

2

我不是專家,但我也有類似的問題,我用@Alternative固定更簡單的方式,通過註釋bean自身,從而使生產者是有利的。可能是我錯過了一些副作用,但這個工作盡我所能看到/需要。