【问题标题】:EJB remote client throwing nullpointerexception : Unable to acquire SerialContextProviderEJB 远程客户端抛出空指针异常:无法获取 SerialContextProvider
【发布时间】:2017-12-20 16:07:42
【问题描述】:

我有一个无状态的 bean

 @Stateless
 public class CalculatorImpl implements Calculator {
 private static final long serialVersionUID = 1L;
 @Override
  public int add(int a, int b) {
return a+b;
  }
    @Override
   public int sub(int a, int b) {
return a-b;
   }
   @Override
   public int mul(int a, int b) {
return a*b;
  }
   @Override
    public float div(int a, int b) {
return a/b;
   }
    }

我已经在 glassfish 上部署了这个,界面用@Remote 注释

  @Remote
  public interface Calculator extends Serializable{
  public int add(int a, int b)throws RemoteException;
  public int sub(int a, int b)throws RemoteException;
   public int mul(int a, int b)throws RemoteException;
   public float div(int a, int b)throws RemoteException;
  }

当我尝试通过客户端(即 java 桌面应用程序)访问它时: 它正在抛出 NullpointerException

客户端代码:

      MyClient client= new MyClient();
  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, 
  // but im using tcpviewer to redirect my 50005 port to 3700
  props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

  InitialContext context = new InitialContext(props);

 client.cart = (ShoppingCart) context
        .lookup("java:global/EJBDemo2EAR/EJBDemo2/CalculatorImpl!com.java.stateless.Calculator");
System.out.println("In doget");
client.cart.buy("soap", 12);
client.cart.getCartContents();

错误是: java.lang.NullPointerException 在 com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:347) 在 com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:354) 在 com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:384) 在 com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:329) 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:477) 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438) 在 javax.naming.InitialContext.lookup(InitialContext.java:417) 在 com.java.client.MyClient.main(MyClient.java:30) 线程“主”javax.naming.NamingException 中的异常:在 SerialContext [myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory,org.omg.CORBA.ORBInitialHost=localhost,java.naming.factory.url.pkgs=com.sun.enterprise.naming,java.naming。 factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [根异常是 javax.naming.NamingException:无法为 SerialContext 获取 SerialContextProvider[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory,org.omg.CORBA.ORBInitialHost=localhost,java.naming.factory.url.pkgs=com.sun.enterprise.naming,java.naming。 factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [根异常是 java.lang.NullPointerException]] 在 com.sun.enterprise.naming.impl.SerialContext.lookup

【问题讨论】:

  • 已将 gf-client 和 appserv-rt.jar 添加到类路径中,但无法正常工作

标签: java ejb


【解决方案1】:

在 context.lookup 中只需传递完全限定的接口名称:

client.cart=(ShoppingCart)context.lookup("com.java.stateless.Calculator");

【讨论】:

  • 你能看到你的 ejb 的 JNDI 入口吗?请按照步骤检查您的 ejb 是否在 glassfish 服务器的 JNDI 树中列出。如果条目在那里,您应该能够查找它。您的代码似乎是正确的。 docs.oracle.com/cd/E26576_01/doc.312/e24938/…
  • 当我启动服务器时,我可以在日志中看到 jndi 名称: EJB ShoppingCartBean 的便携式 JNDI 名称:[java:global/EJBProjectOneEAR/EJ BProjectOne/ShoppingCartBean, java:global/EJBProjectOneEAR/EJBProjectOne/Shoppin gCartBean!org.jboss.tutorial.stateful.bean.ShoppingCart]|#] 但是当我做 list-jndi-entries 时不可见
猜你喜欢
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 2012-05-27
  • 1970-01-01
  • 2020-07-25
相关资源
最近更新 更多