如何在非EJB类中实例化EJB对象?

时间:2012-10-24 05:50:05

标签: java ejb-3.0 openejb

我正在使用Maven框架来构建我的项目,EJB 3.0是EJB规范。我有一个EJB接口A和它对应的实现A的EJB类B.B类的主体如下所示:

@Stateless
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
class B implements A{

      @PersistenceContext(unitName = "Draco-PU", type = PersistenceContextType.TRANSACTION)
  EntityManager entityManager;  

      //called post construct
      @PostConstruct
      public init(){

            //body of init method

      }

我在同一个项目下的不同包中有一个非EJB类。我想在这个类中实例化B类,以便自动引用init()方法和其他注释,并且我可以显式调用EJB类中的其他方法。请帮忙。

1 个答案:

答案 0 :(得分:1)

你做不到。 NonEJBClass.someMethod()的调用者需要将A传递给someMethod(因为调用者注入或查找它),或者someMethod需要自己进行查找(可能在“java:”命名空间之一)。否则,您需要更改您的bean,以便非托管客户端可以使用它,例如:

豆:

@Stateless
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
class B implements A {
    private EntityManager entityManager;  

    @PersistenceContext(unitName = "Draco-PU", type = PersistenceContextType.TRANSACTION)
    public void setEntityManager(EntityManager em) {
        entityManager = em;
    }

    @PostConstruct
    public init() {
        //body of init method
    }
}

非托管客户端:

B obj = new B();
obj.setEntityManager(...);
obj.init();

因此,您要么允许容器创建对象(它负责所有注入和初始化),要么自己创建对象(然后您负责所有的setter调用和初始化)。