2014-10-20 9 views
0

나는 다음과 같은 상황이 : 나는 두 번째 관리자에게상속을 사용할 때 EJB를 기본 구현으로 정의하는 방법은 무엇입니까?

@Inject 
private ProjectManagerForLargeProjects pMFLP; // no problems, as expected 

을 주입하려고하지만 기본 ProjectManager를 주입 할 때 컨테이너가 모르는 경우

@Stateless 
public class ProjectManager{ 
    ... 
} 

@Stateless 
public class ProjectManagerForLargeProjects extends ProjectManager{ 
    ... 
} 

그래서,이 잘 작동합니다 선택할 수있는 구현.

@Inject 
private ProjectManager pM; // causes exception: WELD-001409 Ambiguous dependencies for type [ProjectManager] with qualifiers [@Default] at injection point ... 

@Named를 사용하여 구현을 지정할 수 있지만 저는 ProjectManager가 ProjectManager의 기본값이라고 말하고 싶습니다. 쉬운 방법이 있습니까?


해결책 : @Inject 대신 @EJB를 사용했는데 모든 것이 예상대로 작동하지만 이유는 무엇입니까?

+0

별도의 인터페이스를 사용하십시오. 그건 그렇고, 나는 당신이 겪고있는 문제가 코드 냄새에 대한 강한 징조라고 생각한다. –

+0

흠 우리는 일부 기능을 가진 상태없는 빈을 제공하는 jee API를 사용하고 있습니다. 우리는 몇 가지 기능을 추가하고 싶습니다 ... 내 눈에 고전적인 상속을, JEE에서하지 않겠습니까? – Marcel

+0

composition이 옵션이 아닌 경우 여기에있는 두 개의 유스 케이스에 대해 두 개의 별도 인터페이스를 사용하는 것이 바람직합니다 (또는 한정자에 의해 명시 적으로 구분되도록). –

답변

2

@EJB이 여기에서 작동하고 @Inject이 작동하는 이유는 각 주석이 종속성을 찾는 방법의 결과물이 아닙니다. EJB는 해상도를 위해 빈 이름을 사용하지만 Inject는 유형 계층을 사용합니다. 이 특정한 경우 Inject는 한정자를 사용하지 않으면 작동하지 않습니다.