如何注入EJB的子类

时间:2012-09-27 22:39:22

标签: java-ee dependency-injection ejb-3.0

我有抽象EJB及其两个子类。在我的托管bean中,我希望有一个抽象类型的字段,并根据传递给页面的参数对其进行初始化,并使用其中一个子类的实例。我想使用注射无法做到这一点,我应该使用良好的旧JNDI查找......或者可能有一种方法可以重新设计它以便能够使用注射?

修订版我想我无法定义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
}

2 个答案:

答案 0 :(得分:3)

这不是EJB的使用方式。你不是注入实现,而是接口。

提出一个接口(你需要在EJB 3.0中)和一个抽象类(你可以让你的EJB继承自一个抽象的非EJB类;抽象的EJB没有任何意义,因为它们意味着要实例化容器)。使用相应注释的“name”参数:

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; 
}

答案 1 :(得分:-3)