你用的是什么ejb服务器?

解决方案 »

  1.   

    楼主还要加上:
    Properties props = System.getProperties(); //from ??
    props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
    props.put(Context.PROVIDER_URL, "192.168.0.11");——192.168.0.11就是JNDI服务器的IP。
      

  2.   

    如果你只是在容器内部调用lookup井陉查找就不需要用户名和密码了
      

  3.   

    以下事我的笔记,看有没有帮助:
    在开始使用JNDI之前,需要正确配置它,这样才能保证需要使用命名服务的客户机能正确的定位命名服务并用它查找资源。在使用EJB服务器的时候服务器一般已经配置好JNDI,而且JNDI在EJB服务器启动的时候也会启动,现在需要设置的是客户机如何查找并连接到组件接口的实现。客户机通过环境属性建立与JNDI环境的连接,从而使用JNDI提供的服务。在不同厂商提供的JNDI服务中有一些通用的环境属性,其中最重要的两个属性是java.naming.factory.initial和java.naming.provider.url,客户机需要设置这两个属性才能定位命名服务。java.naming.factory.initial表示初始语境工厂,通过这个语境工厂创建新的InitialContext引用(命名服务跟级别的引用),该属性值应该是所使用得工厂类的完整限制类名称,比如对于weblogicJNDI工厂,该属性设置为java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory。java.naming.provider.url表示环境值的名称,它告诉SPI在何处可以找到JNDI命名服务,它的格式通常为prorocol://host:port,比如对于weblogic,该属性设置为:java.naming.provider.url=t3://localhost:7001。要设置JDNI环境属性,可以通过以下几种方法实现:在InitialContext构造函数中设置,使用系统属性和使用资源文件。
    方法一在InitialContext构造函数中传入一个hashtable,代码为:
    Hashtable env= new Hashtable ();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
    env.put(Context.PROVIDER_URL, "t3://localhost:7001");
    Context ctx=new InitialContext(env);
    方法二在启动Java应用程序的时候通过系统属性提供JNDI环境属性值,比如使用如下命令来设置JNDI环境属性:java  -Djava.naming.factory.initial=weblogic.jndi.WLInitialContextFactory -Djava.naming.provider.url=t3://localhost:7001
    方法三使用资源文件使得设置于应用程序完全分离,便于维护。服务提供者和JNDI类库可以自动定位并使用这些资源文件,因此这种方法最灵活。我们可以编辑一个jndi.properties文件,内容为(对于weblogic):
    java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory java.naming.provider.url=t3://localhost:7001
    然后保证其路径包含在环境变量中(比如放在编译后的classes文件夹下)以保证能够被正确定位。这样不用再在构造函数中提供环境属性就可以创建InitialContext对象,例如Context ctx=new InitialContext()。但是对于一些比较敏感的信息比如用户名密码等,则不易包含在这种资源文件中。这种自己编写的资源文件称为应用程序资源文件,另外还有一种资源文件由JNDI服务提供者提供,成为提供者资源文件,在这种资源文件中放置本身服务的特定属性,对于这类资源文件中设置的某个java.naming.factory属性将覆盖其他已经设置的对应的属性。客户机在连接某个JNDI命名服务时,首先如果所有环境属性都使用InitialContext构造函数传递,这些属性就用来初始化语境,其次JNDI环境会添加系统属性,最后添加被包含的资源文件中的环境属性。
      

  4.   

    多谢大家的帮助,但我的问题还是没解决
    我用的weblogic6.1,上面lookupHome中的getInitialContext函数是这样的,其中
    System.out.println一句的输出是:myurl: t3://127.0.0.1:7001/private Context getInitialContext() throws NamingException
    {
    try
    {
    Properties h=System.getProperties();
    h.put(Context.INITIAL_CONTEXT_FACTORY,
    "weblogic.jndi.WLInitialContextFactory");
    System.out.println("myurl: " + myurl);
    h.put(Context.PROVIDER_URL,myurl);
    return new InitialContext(h);
    }catch(NamingException ne)
    {
    log("we were unable to get a connection to the Weblogic server at "+myurl);
    log("please make sure that the serve is runnig.");
    throw ne;
    }
    }
      

  5.   

    1.你确信你的ejb deploy successfull?
    2.你保证你写在weblogic-ejb-jar.xml配置文件里的jndiname和你在client中调用的常量JNDI_NAME一样吗?
      

  6.   

    我想问题应该出在return (TraderHome) narrow(home,TraderHome.class);这一句上,我把它改成了return (TraderHome) PortableRemoteObject.narrow(home,TraderHome.class);JNDI name的错误就不报了,现在出的错误是这样的:
    Exception in thread "main" javax.naming.NameNotFoundException: Unable to resolve
     examples.ejb.basic.statelessSession.TraderHome Resolved: '' Unresolved:'example
    s' ; remaining name 'ejb.basic.statelessSession.TraderHome'
            at weblogic.rmi.internal.BasicOutboundRequest.sendReceive(BasicOutboundR
    equest.java:85)
            at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteR
    ef.java:253)
            at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteR
    ef.java:220)
            at weblogic.rmi.internal.ProxyStub.invoke(ProxyStub.java:35)
            at $Proxy0.lookup(Unknown Source)
            at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:323)
            at javax.naming.InitialContext.lookup(InitialContext.java:347)
            at examples.ejb.basic.statelessSession.Client.lookupHome(Client.java:80)        at examples.ejb.basic.statelessSession.Client.<init>(Client.java:21)
            at examples.ejb.basic.statelessSession.Client.main(Client.java:40)
    好像说找不到包啊?可为什么编译能通过呢?
      

  7.   

    好像说找不到包啊?可为什么编译能通过呢?
    能编译过,又不是说明就能够在run是
    不出错,run是,是要看你在web中间件
    中部署成功了没有,即你要求的all class
    和成却的xml config文件