2011-11-23 55 views
1

我有父類叫Navigation和子類叫ExtendingNavigationNavigation註釋爲@Named("navigation")@SessionScoped(javax.enterprise.context.SessionScoped;)。在其中,我注入UserBean並將其初始化爲login()方法。可以說我想在其他類中使用userBean。我該怎麼做?爲什麼我不能從Navigation延伸?擴展@Named @SessionScoped bean

這裏是類(只是例子):

導航

@Named("navigation") 
@SessionScoped 
public class Navigation implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Inject 
    protected UserBean userBean; 

     public void logout() { 
     userBean = null; 
    } 

    public void login() {  
     EntityManager em = JPAUtil.getEntityManagerFactory().createEntityManager(); 
     userBean = em.find(UserBean.class, userBean.getUsername()); 
    } 
} 

ExtendingNavigation

public class ExtendingNavigation extends Navigation{ 


} 

如果我嘗試編譯這一點,給我一個錯誤。

17:01:29,956 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC00001: Failed to start service jboss.deployment.unit."timereport.war".WeldService: org.jboss.msc.service.StartException in service jboss.deployment.unit."timereport.war".WeldService: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [NavigationBean] with qualifiers [@Default] at injection point [[field] @Inject timereport.ui.biz.faces.context.ValidateUserAuthenticationAction.navigation]. Possible dependencies [[Managed Bean [class timereport.navigation.NavigationBean] with qualifiers [@Any @Default @Named], Managed Bean [class timereport.navigation.ExtendingNavigation] with qualifiers [@Any @Default]]] 
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:96) 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1824) [jboss-msc-1.0.1.GA.jar:1.0.1.GA] 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1759) [jboss-msc-1.0.1.GA.jar:1.0.1.GA] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) [:1.6.0_07] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) [:1.6.0_07] 
    at java.lang.Thread.run(Thread.java:619) [:1.6.0_07] 
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [NavigationBean] with qualifiers [@Default] at injection point [[field] @Inject timereport.ui.biz.faces.context.ValidateUserAuthenticationAction.navigation]. Possible dependencies [[Managed Bean [class timereport.navigation.NavigationBean] with qualifiers [@Any @Default @Named], Managed Bean [class timereport.navigation.ExtendingNavigation] with qualifiers [@Any @Default]]] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:274) 
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:106) 
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:129) 
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:351) 
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:336) 
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:404) 
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:82) 
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:89) 
    ... 5 more 

幫助請幫助!

+0

你得到的錯誤是什麼?堆棧跟蹤?謝謝 – Mechkov

+0

我發佈了stacktrace中出現錯誤的確切部分。假設上面的示例中的導航bean在我的代碼 – nyxz

+0

P.S.中稱爲NavigationBean。使ExtendingNavigation Named或SessionScoped不起作用。 – nyxz

回答

1

問題不在於注入UserBean,你絕對可以在其他地方使用它。

問題是您的子類ExtendingNavigation與您的Navigation類(名稱「導航」)具有相同的限定符。註釋ExtendingNavigation@Named("extendedNavigation")或類似的東西,然後指定@Named("extendedNavigation")旁邊@Inject你希望使用它。

想想這樣:你說「給我一個X類的實例」,而Weld說「我不知道你想要哪一個」,因爲實際上有兩個類是導航。

class ValidateUserAuthenticationAction { 
    @Inject 
    @Named("extendedNavigation") 
    private Navigation navigation; 
} 

此外,嘗試使用接口!導航應該是一個界面。 BasicNavigation應該實現它,並且ExtendedNavigation也應該實現它。

+0

非常好,謝謝:) – nyxz

1

你的問題是,你正在注入Navigation的實例在你的類ValidateUserAuthenticationAction然而,你有兩個不同的類可以在該注入點使用,就像主要異常狀態一樣。解決這個問題的最簡單方法是向注射點(如果您選擇)和兩個Navigation類中的一個添加限定符。

限定符是解決這個問題的方法,它們在規範中的全部意義。限定詞爲注射點增加了額外的消歧,換句話說,它有助於專門化一個類和一個注射點。

+0

'@ Named' **是**限定詞。只要給子類一個不同的'@命名' –

+0

命名是特殊的,但往往不像其他限定符那樣對待。 – LightGuard

+0

你能鏈接一個參考,所以我可以閱讀嗎? –

0

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

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

enter image description here

相關問題