簡體   English   中英

initialContext.lookup()-javax.naming.NoInitialContextException

[英]initialContext.lookup()-javax.naming.NoInitialContextException

我正在嘗試從客戶端代碼訪問ejb方法sayHello()。
我所做的:1:創建了HelloWorld界面

    package remoteif;
    import java.rmi.*;
    import javax.ejb.*;
    public interface HelloWorld extends EJBObject{
    public String sayHello() throws RemoteException;
     }

2:HelloWorldHome

package homeif;
import remoteif.HelloWorld;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
import java.rmi.RemoteException;
public interface HelloWorldHome extends EJBHome {
    public HelloWorld create() throws
            CreateException, RemoteException;
}

3:Bean實現HelloWorldBean

package beanimpl;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import java.rmi.RemoteException;
public class HelloWorldBean implements SessionBean {
    // Methods of Remote interface
    public String sayHello() {
        return "Hello, world !";
    }
    // Methods of Home interface
    public void ejbCreate() {}
    protected SessionContext ctx;
    public void setSessionContext(SessionContext ctx) {
        this.ctx = ctx;
    }
    @Override
    public void ejbRemove() throws EJBException, RemoteException {
        //To change body of implemented methods use File | Settings | File Templates.
    }
    @Override
    public void ejbActivate() throws EJBException, RemoteException {
        //To change body of implemented methods use File | Settings | File Templates.
    }
    @Override
    public void ejbPassivate() throws EJBException, RemoteException {
        //To change body of implemented methods use File | Settings | File Templates.
    }
}

4:部署描述符:jonas-ejb-jar.xml和ejb-jar.xml
5:通過包含這些類,接口和xml文件創建jar文件
6:創建客戶端應用程序並將創建的jar添加為庫文件
7,創建HelloClient

package client;
import homeif.HelloWorldHome;
import remoteif.HelloWorld;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
public class HelloClient {
    public static void main(String args[]) {
        try {
            Context initialContext = new InitialContext();
            Object objref = initialContext.lookup("myHelloWorld");
            System.out.println("3");
            HelloWorldHome home =
                    (HelloWorldHome) PortableRemoteObject.narrow(objref,
                            HelloWorldHome.class);
            HelloWorld myHelloWorld = home.create();
            String message = myHelloWorld.sayHello();
            System.out.println(message);
        } catch (Exception e) {
            System.err.println(" Error : " + e);
            System.exit(2);
        }
    }
}

但是當我運行它時

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
我該如何解決?

在類路徑中創建一個名為jndi.properties的文件,並添加以下行:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://DEIN_EXTERNER_SERVER:1099

這樣可以解決您的問題。

您將此主題標記為已回答,但是我想說,我認為必須將bean注釋為@LocalBean或將接口注釋為@Remote / @Local才能擁有遠程/本地bean。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM