如何在有状态会话bean上下文查找期间定义名称?

时间:2019-06-21 20:56:28

标签: java intellij-idea java-ee ejb stateful

我正在设置一个有状态会话bean,并想使用context.lookup(name)进行调用,但是不知道如何正确定义name变量。

我正在使用Intellij,据我所知,与NetBeans相比,没有办法自动生成此路径。我已经使用针对该名称找到的指南尝试了多种方法: java:scope [/ app-name] / module-name / bean-name [!完全限定接口名称] 但是,我总是得到以下错误  javax.naming.NamingException:在SerialContext [myEnv = {java.naming.factory.initial = com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.state = com.sun中,“ RememberEJB”的查找失败。 corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl,java.naming.factory.url.pkgs = com.sun.enterprise.naming} [根异常是javax.naming.NameNotFoundException:找不到RememberEJB]

下面是调用函数的方法:

public Response getRememberedPost() {
    try {
        javax.naming.Context context = new InitialContext(); // Could also be InitialContext context = new InitialContext();
        RememberBean rememberBean = (RememberBean) context.lookup("RememberEJB");
        return Response.ok(rememberBean).build();
    }
    catch (NamingException e) {
        e.printStackTrace();
        return Response.noContent().build();
    }
}

我希望名称变量必须类似于“ java:global / project-name / folder-for-beans / RememberEJB!src.Beans.RememberLocal”,但这仍然会产生相同的错误。

2 个答案:

答案 0 :(得分:0)

您可以从Java EE tutorial中引用以下内容:

使用无接口视图访问本地企业Bean
可以通过依赖项注入或JNDI查找来实现对公开本地,无接口视图的企业bean的客户端访问。

  • 获取对企业bean的无接口视图的引用 通过依赖性注入,使用javax.ejb.EJB批注和 指定企业bean的实现类:

    @EJB    
    ExampleBean exampleBean;
    
  • 获取对企业bean的无接口视图的引用 通过JNDI查找,使用javax.naming.InitialContext接口的 查找方法:

    ExampleBean exampleBean = (ExampleBean)InitialContext.lookup("java:module/ExampleBean");
    

所以在您的情况下:

    RememberBean rememberBean = (RememberBean)context.lookup("java:module/RememberEJB");

答案 1 :(得分:0)

我尝试了艾哈迈德·拉伊(Ahmed Raaj)给出的答案,但仍然无法正常工作。我最终通过在启动时查看服务器日志找到了正确的名称,该日志显示了我的有状态bean的JNDI名称。就我而言,这是下面显示的名称。

 RememberBean rememberBean = (RememberBean) context.lookup("java:global/DistributedGlassfish_ear_exploded/ejb/RememberEJB!Beans.RememberBean");

这与我以前尝试过的非常接近,我只是没想到还必须包含'_ear_exploded'。