2012-10-24 36 views
0

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

@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

你不能那样做。 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调用和初始化)。

+0

是不是可以在非EJB类中进行查找? – San

+0

你可以这样做,但是你在EJB自己的'java:comp'(托管的)及其调用者'java:comp'(servlet?)中执行查找时处于尴尬的位置。我认为这太混乱了。 –

+0

对不起,我误读:是的,非EJB类可以查找EJB。例如,如果总是从servlet调用非EJB类,则可以在servlet中声明EJB引用,然后非EJB类可以从'java:comp'中查找EJB引用。 –