EJB - 'ejb/BookRequestBean'查找失败

Pra*_*mha 7 java ejb java-ee ejb-3.0 glassfish-3

我是EJB新手,正在尝试"Hello World"类型的EJB Java程序.这是我的EJB:

package dukesbookstore.ejb;
@Stateless(name="BookRequestBean", mappedName="ejb/BookRequestBean")
@Named
public class BookRequestBean {
    //Other codes here
}
Run Code Online (Sandbox Code Playgroud)

这是我的客户:

    Properties prop = new Properties();
    prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
    prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
    prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
    try {
        InitialContext ctx = new InitialContext(prop);                              
        ctx.lookup("ejb/BookRequestBean");
        System.out.println("EJB Look-up successfull!!");
    } catch (NamingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

但每当我尝试运行时,我都会遇到异常:

javax.naming.NamingException:SerialContext中的'ejb/BookRequestBean'查找失败[myEnv = {org.omg.CORBA.ORBInitialPort = 3700,java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory,org. omg.CORBA.ORBInitialHost = localhost,java

我已经加入appserv-rt.jar,gf-client.jar,javaee.jar,但仍没有运气.任何人都可以帮助我,我在这里缺少什么?我是Glassfish 3.1

Rav*_*edi 8

这有几个原因:

1)EJB未映射到JNDI名称.您需要检查是否EJB已成功部署并将其映射到JNDI名称.您可以检查Server GUI,Server Log on startup或使用Universal Test Client,看看是否EJB被正确映射.注意,UTC仅显示远程公开的 EJB.

2)EJB只接触本地申请.在这种情况下,远程调用跨应用程序调用(不同的EAR,WAR ...)EJB将失败.在此方案中,创建远程接口并公开它.本地接口将EJB暴露给本地调用.远程接口将EJB暴露给远程跨应用程序调用.

3)您的RMI/IIOP 端口可能不正确.您可以检查Glassfish GUIServer startup log查看分配的端口 RMI/IIOP.

注意:要诊断确切的问题,请发布完整的堆栈跟踪.


Mil*_*kic 2

除了@RaviTrivedi 的精彩回答之外,这里还有一些想法:

  • @Named注释不应该这样使用
  • 不要同时使用namemappedName,对于 Glassfish 只需使用mappedName
  • 你的EJB应该实现远程接口