从 Web 服务 EJB3 会话 bean 调用 EJB3 会话 bean 导致实体管理器为空
calling EJB3 session bean from a webservice EJB3 session bean causing entity manager null
好的,我这里有一个场景,我想要一个标准的解决方案,基本上我在服务器端将 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;
}
}
上面的 class 基本上是我的 DAO class 现在将处理查询下面是我的网络服务 class
@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 方法,该方法将从数据库中获取数据,return 到 Web 服务,Web 服务将 return 数据到请求客户端
但是当我执行 SQL 查询时,实体管理器为 null 我不知道为什么我开发的非标准解决方案是将实体管理器从 Web 服务 class 传递到 DAO class,正如您在注释掉的示例代码中看到的那样。
所以我的问题是,还有其他标准方法吗?为什么实体管理器在第二个 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);
}
}
好的,我这里有一个场景,我想要一个标准的解决方案,基本上我在服务器端将 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;
}
}
上面的 class 基本上是我的 DAO class 现在将处理查询下面是我的网络服务 class
@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 方法,该方法将从数据库中获取数据,return 到 Web 服务,Web 服务将 return 数据到请求客户端 但是当我执行 SQL 查询时,实体管理器为 null 我不知道为什么我开发的非标准解决方案是将实体管理器从 Web 服务 class 传递到 DAO class,正如您在注释掉的示例代码中看到的那样。
所以我的问题是,还有其他标准方法吗?为什么实体管理器在第二个 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);
}
}