从web服务EJB3会话bean调用EJB3会话bean导致实体管理器为空



我在这里有一个场景,我想要一个标准的解决方案,基本上我已经公开了EJBsession3 bean作为服务器端的web服务,它们进一步调用EJBsession3 bean来执行DAO方法。下面是示例代码。

//This is a EJB3 session bean and I am using container managed jta transactions 
@Stateless
public class datatypes implements datatypesRemote {
@PersistenceContext(unitName = "EJBtest")
EntityManager entityManager;

public List<Datatype> retrieveAllDatatypes(int targetSystemId,EntityManager ent)
        throws RuntimeException {
    String q = "SELECT oneDatatype from " + Datatype.class.getName()
            + " oneDatatype "
            + "where oneDatatype.targetSystem.targetSystemId = "
            + targetSystemId;
    //entityManager=ent;
    Query query = entityManager.createQuery(q);

    System.out.println("Query retrieveAll" + q);
    @SuppressWarnings("unchecked")
    List<Datatype> templates = query.getResultList();
    return templates;
}

}

上面的类基本上是我的DAO类,它将处理查询下面是我的web服务类

 @WebService(serviceName="backend")
    @Stateless
    public class backEndForm implements backEndFormRemote {
    //@PersistenceContext(name = "EJBtest")
    //EntityManager entityManager;
   private datatypesRemote data= new datatypes();
        public List<Datatype> retrieveAllDatatypes(int id){      
            //entityManager.clear();
            data=new datatypes();
            return  data.retrieveAllDatatypes(id,null);
        }
    }

现在的问题是这样的,我的web客户端调用我的web服务方法,该方法进一步调用DAO方法,这些方法将从数据库获取数据并返回到web服务,web服务将数据返回给请求客户端但是,当我执行SQL查询时,实体管理器是空的,我不知道为什么,所以我开发的一个非标准解决方案是将实体管理器从web服务类传递到DAO类,正如您在示例代码中看到的那样,注释掉了。

那么我的问题是,有没有其他的标准方法来做到这一点?为什么实体管理器在第二个ejb3 bean中为空,而在第一个ejb3 bean中为空?

使用new操作符创建对象时不会发生注入。您需要让容器创建datatypes bean并将其注入backEndForm:

@WebService(serviceName="backend")
@Stateless
public class backEndForm implements backEndFormRemote {
    @EJB
    private datatypesRemote data;
    public List<Datatype> retrieveAllDatatypes(int id){      
        return  data.retrieveAllDatatypes(id,null);
    }
}

最新更新