我有抽象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
}
答案 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)