2012-09-27 6 views
1

나는 추상 EJB와 그 하위 클래스 두 개를 가지고있다. 내 관리 빈에서 나는 추상적 인 타입의 필드를 가지며 하위 클래스 중 하나의 인스턴스로 페이지에 전달 된 매개 변수에 따라 초기화하려고합니다. 나는 주사를 사용하여이를 수행 할 수있는 방법이 없다고 생각하고 좋은 JNDI 조회를 사용해야한다 ... 아니면 주사를 사용할 수 있도록 재 설계 할 수있는 방법이 있을까?EJB 하위 클래스 삽입 방법

수정 EJB 추상을 정의 할 수는 없지만 상황은 변하지 않습니다. AbstractEJB가 추상이 아니더라도 하위 클래스 만 인스턴스화하려고합니다.

@Stateless 
public abstract class AbstractEJB { 
    public abstract void method1(); 
} 

@Stateless 
public class Implementation1 extends AbstractEJB() { 
    public void method1() { ... } 
} 

@Stateless 
public class Implementation2 extends AbstractEJB() { 
    public void method1() { ... } 
} 

@ManagedBean 
public class MyManagedBean { 

    @EJB 
    AbstractEJB myEJB; //has to be initialized with either Implementation1 or Implementation2 instance 
} 

답변

1

이 EJB를 사용하기위한 것입니다 방법이 아니다. 구현은 삽입하지 않고 인터페이스는 삽입합니다.

EJB 3.0에서 필요로하는 인터페이스와 추상 클래스 (EJB를 추상화 된 비 EJB 클래스에서 상속받을 수 있으며 추상적 인 EJB는 인스턴스화 할 의도가 없으므로 의미가 없습니다. 컨테이너 별). 각각의 주석의 "이름"매개 변수를 사용하여

public abstract class Abstract implements MyEJBIntf { 
    public abstract void method1(); 
} 

@Stateless(name="EJB1") // defaults to "EJB1" anyway 
public class EJB1 extends Abstract { ... } 

@Stateless 
public class EJB2 extends Abstract { ... } 

@ManagedBean 
public class MyManagedBean { 
    @EJB(name="EJB1") // or "EJB2" 
    MyEJBIntf myEJB; 
} 
+0

이 완전히 내 문제가 해결되지 않습니다 - 나는 런타임에서 인스턴스화 할 수있는 서브 클래스를 결정해야을 (매개 변수에 열린 페이지를 따라) – AndreiM

+0

아니, '아무튼 나는이 가정을 간과했다. 주입은 응용 프로그램 시작시 발생하며 JNDI 조회 만 동적입니다. 또 다른 옵션은 두 EJB를 다른 필드에 주입하고 "if"또는 좀 더 정교한 패턴으로 선택하는 것입니다. – MaDa

+0

_ 다른 옵션을 사용하면 두 필드 모두에 EJB를 삽입하고 "if"또는 좀 더 정교한 패턴으로 선택된 EJB 중 하나를 선택하는 것입니다. - 그게 바로 현재이 문제가 해결 된 방법입니다. 나는 불필요한 인스턴스 주입과 관련된 비용을 피하려고 노력하고 있었다고 생각합니다. – AndreiM