【问题标题】:calling EJB3 session bean from a webservice EJB3 session bean causing entity manager null从 Web 服务 EJB3 会话 bean 调用 EJB3 会话 bean 导致实体管理器 null
【发布时间】:2016-09-29 09:13:52
【问题描述】:

好的,我在这里有一个场景,我想要一个标准的解决方案,基本上我已经在服务器端公开了 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 中?

【问题讨论】:

    标签: java web-services ejb hibernate-entitymanager


    【解决方案1】:

    当您使用 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);
        }
    }
    

    【讨论】:

    • 我已经尝试过了,但这并不能让我部署项目我得到一些错误.. 我忘了提到我正在使用 JBOSS AS7/wildfly 服务器
    • 哦对不起,错误是由其他原因引起的,我以前尝试过这个东西,但我不知道这是最好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多