【问题标题】:EJB3 Glassfish JNDI lookupEJB3 Glassfish JNDI 查找
【发布时间】:2011-08-08 00:50:10
【问题描述】:

我正在使用 Glassfish 捆绑的 Eclipse IDE。我编写了一个简单的 EJB 应用程序。但它不起作用。

@Stateless
@Remote(CalculatorRemote.class) 
@Local(CalculatorLocal.class) 
public class Calculator implements CalculatorRemote, CalculatorLocal {
    @Override
    public String sayHello(String name) {
        System.out.println("ejb:"+name);
        return null;
    }
}

----

@Remote
public interface CalculatorRemote {
    public String sayHello(String name);

}
-------

@Local
public interface CalculatorLocal {
    public String sayHello(String name);
}

我写了一个独立的客户端来测试,但是失败了。找不到 JNDI。

public class Main {

    public static void main(String[] args) throws Exception {        
        InitialContext ctx = new InitialContext();      
        CalculatorRemote bean = (CalculatorRemote) ctx.lookup("java:global/TestEAR/TEjb/Calculator!com.CalculatorRemote");
        bean.sayHello("Billy Bob");

    }

}

在服务器日志中,它说

INFO: Portable JNDI names for EJB Calculator : [java:global/TestEAR/TEjb/Calculator!com.CalculatorRemote, java:global/TestEAR/TEjb/Calculator!com.CalculatorLocal]
INFO: Glassfish-specific (Non-portable) JNDI names for EJB Calculator : [com.CalculatorRemote, com.CalculatorRemote#com.CalculatorRemote]

我也试过了

ctx.lookup("com.CalculatorRemote")

还是不行。

错误信息是

java.lang.NullPointerException
    at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297)
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at com.Main.main(Main.java:9)
Exception in thread "main" javax.naming.NamingException: Lookup failed for 'java:global/TestEAR/TEjb/Calculator!com.CalculatorRemote' in SerialContext  [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext  [Root exception is java.lang.NullPointerException]]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at com.Main.main(Main.java:9)
Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext  [Root exception is java.lang.NullPointerException]
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:276)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
    ... 2 more
Caused by: java.lang.NullPointerException
    at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297)
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271)
    ... 3 more

请帮助我。

【问题讨论】:

    标签: glassfish ejb jndi


    【解决方案1】:

    你可以添加上面的行吗:

      Properties props = new Properties();
     props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
     props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
     // glassfish default port value will be 3700,
    props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
    InitialContext ctx = new InitialContext(props);
    
     CalculatorRemote bean = (CalculatorRemote) ctx.lookup("java:global/TestEAR/TEjb/Calculator!    com.CalculatorRemote");
    

    我在这里使用 EJB3x 和 Glassfish v3 创建了一篇博文。 http://anirbanchowdhury.wordpress.com/2012/06/07/ejb-3-application-in-glassfish-3x/

    【讨论】:

      【解决方案2】:

      我认为抛出异常是因为您没有正确配置初始上下文。要么创建一个 jndi.properties 文件,要么创建一个包含属性的哈希表并将其发送到 IntialContext 的构造函数。

      Creating EJB3 using Netbeans and Glassfish

      【讨论】:

        【解决方案3】:

        就在今天,我遇到了这个问题。 您的独立客户端失败,但它可以在 GF EJB 容器中运行。

        对于客户端测试,您需要做两件事才能使其工作:

        1. 从 GlassFish_install_folder\glassfish\lib 获取 javaee、gf-client 和 appserv-rt jar。最后一个包含 jndi.prop 所以你可以使用默认的 c-tor InitialContext();
        2. 从 GlassFish_install_folder\glassfish\modules 获取所有 jars。

        这些 jars 需要在您的类路径中。这很愚蠢,但我还不知道 2) 中的最小罐子才能使其正常工作。

        【讨论】:

          【解决方案4】:

          解决方法如下。

          在下面的代码中,你必须在另一个 JVM 中调用一个 bean 对吗?例如,您的主要课程 在 JRE 中,而 BEAN 在 Glassfish JVM 中。


          public class Main {
          
              public static void main(String[] args) throws Exception {        
                  InitialContext ctx = new InitialContext();      
                  CalculatorRemote bean = (CalculatorRemote) ctx.lookup("java:global/TestEAR/TEjb/Calculator!com.CalculatorRemote");
                  bean.sayHello("Billy Bob");
              }
          }
          

          【讨论】:

          • 在查找上下文时,如何指定 IP 地址或 URL?也就是说,上下文查找发生在“哪里”?
          【解决方案5】:
          1. 您的大部分代码都是正确的,但问题是客户端,因为您有本地和远程接口,所以我已在客户端中添加了我的 cmets,希望它能够自我解释。而且....
          2. 在 EJB 上添加 @javax.ejb.Stateless(name = "CalculatorEJB") //这是可移植的,没有锁定供应商。替代方案是 mappedName,我认为它更以 weblogic 和 glassfish 为中心。
          3. 确保您的类路径中有 client.jar。
          4. 我已经在 glassfish 容器中部署了 EJB,一旦 ear 部署成功,就运行客户端。
          5. 除了以下代码,您不需要任何其他配置。这段代码是可移植的,应该适用于大多数容器,但是 Surprises 很有趣,请按原样运行并告诉我.....

          ================================

          1. 远程接口

          包 com.au.ejbs;

          import javax.ejb.Local;
              
          @Local
          public interface CalculatorLocalI {
               String sayHello(String name);
          }
          
          package com.au.ejbs;
          
          import javax.ejb.Remote;
          
          @Remote
          public interface CalculatorRemoteI {
              String sayHello(String name);
          }
          
          
          =================================
          2. The Impl
          
          
          package com.au.ejbs;
          
          @javax.ejb.Stateless(name = "CalculatorEJB") //Added this is portable instead of using mappedName
          public class Calculator implements CalculatorRemoteI, CalculatorLocalI {
              @Override
              public String sayHello(String name) {
                  return  "ejb:"+name;
              }
          }
          
          
          
          ======================================
          3. The client
          
          
          package com.au.clients;
          
          
          import com.au.ejbs.CalculatorRemoteI;
          
          import javax.naming.InitialContext;
          
          public class CalculatorT {
          
              public static void main(String[] args) throws Exception {
                  InitialContext ctx = new InitialContext();
                  CalculatorRemoteI bean = (CalculatorRemoteI) ctx.lookup("java:global/ejb3_2_ear_exploded/ejb/CalculatorEJB!com.au.ejbs.CalculatorRemoteI");
                  //portable syntax java:global/[ ear name]/[module name normally the jar name in my case ejb.jar within the ear, ejb3_2_ear_exploded]/name in ....javax.ejb.Stateless(name = "CalculatorEJB")/
                  //Now since you have both local and remote interfaces so the extra after the bang ! symbol namely the explicit remote interface name.
                  //if you had only 1 remote interface impl you will require only (CalculatorRemoteI) ctx.lookup("java:global/ejb3_2_ear_exploded/ejb/CalculatorEJB");
                  System.out.println("===output==" +bean.sayHello("Billy Bob"));
          
              }
          
          }
          
          4. output
          ===output==ejb:Billy Bob
          

          【讨论】:

            猜你喜欢
            • 2010-12-04
            • 2011-11-26
            • 2018-09-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-13
            • 1970-01-01
            相关资源
            最近更新 更多