Hello.java如下:package examples.session.stateless;public interface Hello {
    public String hello() ;
}HelloBean.java如下:package examples.session.stateless;import javax.ejb.*;@Stateless
@Remote(Hello.class)
public class HelloBean implements Hello{
   
    public String hello(){
        System.out.println("hello()");
        return "Hello,World!";
    }
}
package examples.session.stateless;import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;public class HelloClient {
    public static void main(String[] args) throws Exception{
        Context ctx=new InitialContext();
        Hello hello=(Hello)ctx.lookup("example.session.stateless.Hello");
        System.out.println(hello.hello());
    }
}服务器用weblogic9.2,程序发布上去后,运行HelloClient.java,提示如下:
init:
deps-jar:
compile-single:
run-main:
Exception in thread "main" 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
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
        at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
        at javax.naming.InitialContext.lookup(InitialContext.java:392)
        at examples.session.stateless.HelloClient.main(HelloClient.java:20)
Java Result: 1
请问什么原因?该怎么改???

解决方案 »

  1.   

    Hello hello=(Hello)ctx.lookup("example.session.stateless.Hello");
    改成
    Hello hello=(Hello)ctx.lookup("remote/example.session.stateless.Hello")或
    Hello hello=(Hello)ctx.lookup("example.session.stateless.Hello/remote")具体哪个忘了
      

  2.   

    好象不需要重起。如果是热部署的话,最后那个文件导个examples.session.stateless。HelloBean 试试
      

  3.   

    sxq129601
     
    (Jod.Sun) 好象不需要重起。如果是热部署的话,最后那个文件导个examples.session.stateless。HelloBean 试试 怎么导入?
      

  4.   

    import了还是不行,还是同样的错误。
      

  5.   

    语句好象没啥问题啊。你用debug看看。到哪出错了
      

  6.   

    就是Hello hello=(Hello)ctx.lookup("example.session.stateless.Hello");这一句
      

  7.   

    你那样写肯定不对的要 example.session.stateless.Hello/remote
      

  8.   

    晕我知道原因了。你怎么调用接口啊,应该是examples.session.stateless.HelloBean/remote
      

  9.   

    我想起来了,Context ctx=new InitialContext();
    语句之后还要写3条语句,以前我是放在属性文件里的
      

  10.   

    看一下你的EJB怎么在Weblogic上部署的它的命名空间你写的是什么
      

  11.   

    看一下你的EJB怎么在Weblogic上部署的 它的命名空间你写的是什么
    在哪里看???概述   目标   备注     
     单击 更改中心内的锁定并编辑 按钮,以修改此页上的设置。 
     使用此页可以查看(有时更改)有关 J2EE 库的常规配置信息,如名称、应用程序源的路径以及临时模式。使用“部署顺序”字段可以更改服务器启动时部署此库的相对于其他部署的顺序。
     
     
     名称: HelloBeanEJB 此 J2EE 库的名称。详细信息...  
     路径: D:\ javatest\ HelloBeanEJB\ dist\ HelloBeanEJB. jar “管理服务器”上可部署单元来源的路径。详细信息...  
     临时模式: (未指定) 用于指定是否在应用程序准备期间,将应用程序文件从管理服务器上的源复制到受管服务器临时区域的模式。详细信息...  
     部署顺序:  表示启动过程中此单元相对于服务器上的其他 DeployableUnit 的部署时间的数值。详细信息...  
     
     
     是这个HelloBeanEJB吗?
      

  12.   

    我想起来了,Context ctx=new InitialContext(); 
    语句之后还要写3条语句,以前我是放在属性文件里的 哪三条?
      

  13.   

    看到上面的这些回答真的好心酸,实质问题时你的JNDI设置不对,也就你单机(不是servlet)用JNDI的时候是需要配置的。
    第一:
    new InitialContext()的时候:
    Context ctx=new InitialContext(); 改成:java.util.Properties h = new java.util.Properties();
    h.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
    h.put(Context.PROVIDER_URL, "t3://localhost:7001");
    //初始化Context对象。
    Context ctx =new InitialContext(h);JNDI需要配置具体的ContextFactory实现类的第二:
    如果出什么CLassNotFound之类的话就把weblogic/lib下的包加到classpath下吧。over!!
      

  14.   

    就是这个。
    java.util.Properties h = new java.util.Properties();
    h.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
    h.put(Context.PROVIDER_URL, "t3://localhost:7001");之前我门是把这些文件放在属性文件里的。之前忘了
      

  15.   

    代码改成如下:public class HelloClient {
        public static void main(String[] args) throws Exception{
            // ctx=new InitialContext();
            java.util.Properties h = new java.util.Properties();
            h.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
            h.put(Context.PROVIDER_URL, "t3://localhost:7001");
            //初始化Context对象。
            Context ctx =new InitialContext(h);
            //Hello hello=(Hello)ctx.lookup("examples.session.stateless.HelloBean");
            //Hello hello=(Hello)ctx.lookup("remote/examples.session.stateless.HelloBean");
            Hello hello=(Hello)ctx.lookup("examples.session.stateless.HelloBean/remote");
            System.out.println(hello.hello());
        }
    }
    提示如下:
    init:
    deps-jar:
    Compiling 1 source file to D:\javatest\HelloBeanEJB\build\jar
    compile-single:
    run-main:
    Exception in thread "main" javax.naming.NameNotFoundException: While trying to lookup 'remote.examples.session.stateless.HelloBean' didn't find subcontext 'remote'. Resolved '' [Root exception is javax.naming.NameNotFoundException: While trying to lookup 'remote.examples.session.stateless.HelloBean' didn't find subcontext 'remote'. Resolved '']; remaining name 'remote/examples/session/stateless/HelloBean'
            at weblogic.rjvm.ResponseImpl.unmarshalReturn(ResponseImpl.java:215)
            at weblogic.rmi.cluster.ClusterableRemoteRef.invoke(ClusterableRemoteRef.java:338)
            at weblogic.rmi.cluster.ClusterableRemoteRef.invoke(ClusterableRemoteRef.java:252)
            at weblogic.jndi.internal.ServerNamingNode_923_WLStub.lookup(Unknown Source)
            at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:379)
            at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:367)
            at javax.naming.InitialContext.lookup(InitialContext.java:392)
            at examples.session.stateless.HelloClient.main(HelloClient.java:23)
    Caused by: javax.naming.NameNotFoundException: While trying to lookup 'remote.examples.session.stateless.HelloBean' didn't find subcontext 'remote'. Resolved ''
            at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1139)
            at weblogic.jndi.internal.BasicNamingNode.lookupHere(BasicNamingNode.java:247)
            at weblogic.jndi.internal.ServerNamingNode.lookupHere(ServerNamingNode.java:171)
            at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:206)
            at weblogic.jndi.internal.RootNamingNode_WLSkel.invoke(Unknown Source)
            at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:553)
            at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:224)
            at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:443)
            at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
            at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:147)
            at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:439)
            at weblogic.rmi.internal.BasicServerRef.access$300(BasicServerRef.java:61)
            at weblogic.rmi.internal.BasicServerRef$BasicExecuteRequest.run(BasicServerRef.java:983)
            at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
            at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
    Java Result: 1
    成功生成(总时间:2 秒)
    还是不成功,快要绝望了。
      

  16.   

    大哥 你已经成功一大半了,还绝望阿。
    [javax.naming.NameNotFoundException]
    这个还不好解决吗??各个服务器为EJBBean生成的默认jndi名称是不一样的,weblogic我不太清楚。
    weblogic不是用管理界面吗,用ie连上去。。
    然后找JNDI server那个节点,从里面找你的bean对应的jndi名称,把你程序里的改成你看到的那个就ok了。有问题加我msn:[email protected]
      

  17.   

    学习weblogic就要学会用他的管理console阿。
      

  18.   


     JNDI 树结构  AdminServer
    bea_wls_remote_deployerbea_wls_remote_deployer_jarDeployerBean_EO
    ejbmgmtMEJBjavaxmejbmejb_jarMejb_EO
    weblogic  
     
     
    怎么没有我ejb呀?是不是我把ejb发布成库不行呀?但是发布成应用程序要报错呀。激活更改期间出错,有关详细信息,请查看日志。  
      Exception preparing module: EJBModule(HelloBeanEJB) [EJB:011023]An error occurred while reading the deployment descriptor. The error was: VALIDATION PROBLEMS WERE FOUND D:\javatest\HelloBeanEJB\dist\HelloBeanEJB.jar\META-INF\ejb-jar.xml:5:6:5:6: problem: cvc-complex-type.2.4c: Expected elements 'session@http://java.sun.com/xml/ns/j2ee entity@http://java.sun.com/xml/ns/j2ee message-driven@http://java.sun.com/xml/ns/j2ee' before the end of the content in element enterprise-beans@http://java.sun.com/xml/ns/j2ee:.  
      VALIDATION PROBLEMS WERE FOUND D:\javatest\HelloBeanEJB\dist\HelloBeanEJB.jar\META-INF\ejb-jar.xml:5:6:5:6: problem: cvc-complex-type.2.4c: Expected elements 'session@http://java.sun.com/xml/ns/j2ee entity@http://java.sun.com/xml/ns/j2ee message-driven@http://java.sun.com/xml/ns/j2ee' before the end of the content in element enterprise-beans@http://java.sun.com/xml/ns/j2ee:  
      

  19.   

    是EJB没有发布成功。所以JNDI树里面找不到。
    log已经说得很清楚了。-----------
    An error occurred while reading the deployment descriptor The error was: VALIDATION PROBLEMS WERE FOUND
    ---
    ejb-jar.xml有问题,把ejb-jar.xml贴出来。
      

  20.   

    你的ejb-jar.xml至少要把你的ejb bean描述一下;先吃饭去了,回来再看你又出什么问题。
      

  21.   

    去看看ejb-jar.xml应该怎么写吧google一下就知道啦
      

  22.   

    ejb_jar.xml内容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <ejb-jar version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
        <display-name>HelloBeanEJB</display-name>
        <enterprise-beans>
      </enterprise-beans>
    </ejb-jar>
      

  23.   

    感觉不对劲,ejb3.0的时候ejb-jar.xml好像不是必须的.你把它删掉吧,你这里用的schema是2.1的schema,好像会有问题,你先删了试一下.以下可以不用看,如果按照2.1的schema的话,
    enterprise-beans下面应该定义一下session 或者实体bean,比如
    .
    <session>
    <ejb-name>Hello</ejb-name>
    <home>sample.HelloHome</home>
    <remote>sample.Hello</remote>
    <ejb-class>sample.HelloBean</ejb-class>
    <session-type>Stateless</session-type>
    <transaction-type>Container</transaction-type>
    <security-identity>
    <use-caller-identity/>
    </security-identity>
    </session>