2011-11-23 2 views
1

부모 클래스가 Navigation이고 하위 클래스가 ExtendingNavigation입니다. Navigation@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 

도움말 pls!

+0

어떤 오류가 발생합니까? 스택 추적? 감사합니다 – Mechkov

+0

나는 stacktrace에서 오류가 나타나는 정확한 부분을 게시했습니다.위의 예제에서 내비게이션 빈을 내 코드 – nyxz

+0

P.S.에서 NavigationBean이라고합니다. ExttendingNavigation Named 또는 SessionScoped를 사용하면 도움이되지 않습니다. – nyxz

답변

1

문제는 UserBean의 주입이 아니므로 절대 다른 장소에서 사용할 수 있습니다.

문제는 하위 클래스 ExtendingNavigationNavigation 클래스 (이름 "탐색")와 동일한 한정자가 있습니다. ExtendingNavigation@Named("extendedNavigation") 또는 이와 유사한 내용을 주석으로 처리하고 @Named("extendedNavigation")@Inject와 함께 사용하도록 지정하십시오.

이런 식으로 생각하십시오. "클래스 X의 인스턴스를주세요"라고 말하면서 Weld는 네비게이션이라는 실제로 두 클래스가 있기 때문에 "어느 클래스가 원하는지 모르겠습니다"라고 말합니다.

또한 인터페이스를 사용해보십시오! 탐색은 인터페이스 여야합니다. BasicNavigation은이를 구현해야하며 ExtendedNavigation도이를 구현해야합니다.

+0

아주 좋아, 고마워. :) – nyxz

1

Navigation의 인스턴스를 클래스 ValidateUserAuthenticationAction에 주입한다는 것이 문제이지만 주 예외 상태와 마찬가지로 해당 주입 지점에서 사용할 수있는 두 가지 클래스가 있습니다. 이를 해결하는 가장 간단한 방법은 주입 지점 (원하는 경우)과 두 개의 Navigation 클래스 중 하나에 한정자를 추가하는 것입니다.

한정자는이 문제에 대한 해결책이며 사양에 포함되어 있습니다. 한정자는 주입 지점에 대한 추가 모호성을 추가합니다. 즉, 클래스와 주입 지점을 특수화하는 데 도움이됩니다.

+0

'@ Named' **는 ** 한정어입니다. 서브 클래스에'@ Named'를 지정하십시오. –

+0

명명 된 이름은 특별하지만 다른 한정자처럼 처리되지 않는 경우가 종종 있습니다. – LightGuard

+0

내가 읽을 수 있도록 참조를 연결할 수 있습니까? –

0

나는 매우 비슷한 문제가있어서 오프라인 도움말이 있습니다. 내 문제는 내 서비스가 어디에 있었는지, 그것은 배포 된 귀에 포함되어 있었고 웹 프로젝트에서도 마찬가지였습니다. 그것은 우발적 인 복제 였고, 하나를 버리십시오, 그리고 그것이 귀하의 경우에도 작동합니다.

여기에 다음 사진이 있습니다. esb_khr_web 안에 esb_khr이 있는데 제거했습니다. 이클립스 : 속성 및 배포 어셈블리로 이동하십시오.

enter image description here