你的配置文件当中应该有下面的一句
<....
....
<ejb>FriendsBean</ejb>
......
<jndi-name>EJB_TEST.FriendsHome</jndi-name>
....>
lookup找的就是这个玩艺.JNDI地址EJB_TEST.FriendsHome就代表了FriendsBean,而至于FriendsBean到底是什么,在相关的配置文件中应该还有定义
比如(这是weblogic6的例子,在文件ejb_jar.xml):
<entity>
<ejb-name>FriendsBean</ejb-name>
<home>examples.ejb.friend.FriendsHome</home>
<remote>examples.ejb.friend.Friends</remote>
<ejb-class>examples.ejb.friend.FriendsBean</ejb-class>
<persistence-type>Bean</persistence-type>
<prim-key-class>examples.ejb.friend.FriendsPK</prim-key-class>
<reentrant>False</reentrant>        <resource-ref>
         <res-ref-name>jdbc/DB_Pool</res-ref-name>
         <res-type>javax.sql.DataSource</res-type>
         <res-auth>Container</res-auth>
        </resource-ref>      </entity>在客户端调用的时候
.........
Context ctx = ....;
            Object ref = ctx.lookup("EJB_TEST.FriendsHome");
            FriendsHome home = (FriendsHome)PortableRemoteObject.narrow(ref,FriendsHome.class);
......

解决方案 »

  1.   

    谢谢 有点明白了
    如果 配置文件中 写的是
      <jndi-name>MySessionBean</jndi-name>
    那么 context.lookup("MySessionBean"); 返回的也还是 Home 接口吗?还有一个问题
    现在 PortableRemoteObject.narrow(ref, MyHome.class); 这一句
    抛出了 java.lang.ClassCastException
      

  2.   

    还有 为什么 总是要把 客户端 MyBeanTestClient 也一起打包进部署的 JAR 文件里呢?
    我觉得这样没有道理啊
    可是 不打包进去 就 java.lang.ClassCastException哎 摸不着头脑 还请多多指教
      

  3.   

    context.lookup(); 这个方法查找的一般都是Home接口,
    至于异常,你确信是和下面的方式相仿么
                FriendsHome home = (FriendsHome)PortableRemoteObject.narrow(ref,FriendsHome.class);
    //  PortableRemoteObject.narrow的功能是将context.lookup(); 获取得对象转换为相应的Home接口.你的异常是class转换异常,请注意你lookup()的是不是MyHome接口的JNDI地址
      

  4.   

    理论上MyBeanTestClient 是不用打包进部署文件的,是不是因为其他原因阿? 我没有用jbuild开发过EJB
      

  5.   

    谢谢 我知道这是 类转换异常
    我想代码是可以确定真确的
        try {
          //get naming context
          java.util.Hashtable JNDIParm = new java.util.Hashtable();
          JNDIParm.put(Context.PROVIDER_URL, "localhost");
          JNDIParm.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");      Context context = new InitialContext(JNDIParm);      //look up jndi name
          Object ref = context.lookup("MyTestHome");
    System.out.println(ref); //无论是否异常都是 MyTestHomeHome
          //look up jndi name and cast to Home interface
          MyTestHome myTestHome = (MyTestHome)PortableRemoteObject.narrow(ref, MyTestHome.class);
        } catch(Exception e) {
          e.printStackTrace();
        }我想会不会是 描述文件的问题
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE jboss PUBLIC '-//JBoss//DTD JBOSS 3.0//EN' 'http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd'>
    <jboss>
        <enterprise-beans>
            <session>
                <ejb-name>MyTestBean</ejb-name>
                <jndi-name>MyTestHome</jndi-name>
            </session>
        </enterprise-beans>
    </jboss><?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
    <ejb-jar>
        <enterprise-beans>
            <session>
                <display-name>MyTestBean</display-name>
                <ejb-name>MyTestBean</ejb-name>
                <home>MyBeanTest.MyTestHome</home>
                <remote>MyBeanTest.MyTest</remote>
                <ejb-class>MyBeanTest.MyTestBean</ejb-class>
                <session-type>Stateless</session-type>
                <transaction-type>Container</transaction-type>
            </session>
        </enterprise-beans>
        <assembly-descriptor>
            <container-transaction>
                <method>
                    <ejb-name>MyTestBean</ejb-name>
                    <method-name>*</method-name>
                </method>
                <trans-attribute>Required</trans-attribute>
            </container-transaction>
        </assembly-descriptor>
    </ejb-jar>
    这里 <assembly-descriptor> 里面的是什么意思? 书上没有提到
      

  6.   

    现在有了一些好转 不用把 客户端 打包进部署文件了
    好像也没怎么设置 有点莫名其妙但是又出现了另一个问题 真是令我哭笑不得我的包结构是这样的
    +-- Client
    |    |
    |    +-- MyTestBeanTestClient
    |
    +-- MyBeanTest
         |
         +-- interface MyTest extends javax.ejb.EJBObject
         |
         +-- interface MyTestHome extends javax.ejb.EJBHome
         |
         +-- class MyTestBean implements SessionBean我想把 Home接口 以及 EJBObject接口 和客户端放在一起 把两个包分开
    却不行 还是那个异常
    所以现在又要把 MyBeanTest 里面的 三个文件 import 到 MyTestBeanTestClient 里或者 就请你告诉我怎样手工完成
      

  7.   


        <assembly-descriptor>
            <container-transaction>
                <method>
                    <ejb-name>MyTestBean</ejb-name>
                    <method-name>*</method-name>
                </method>
                <trans-attribute>Required</trans-attribute>
            </container-transaction>
        </assembly-descriptor>
    你的这一段代码是配置bean的事务属性,此处定义的是MyTestBean中的所有方法都必须在事务中.
    这里的"*"代表所有方法.你可以在这里为每一个方法都定义一个事务属性.
      

  8.   

    如下打包:
    客户端包括: MyTestBeanTestClient,MyTest ,MyTestHome 
    bean包包括: MyTest ,MyTestHome, MyTestBean 
    可以编写一个批处理自动完成打包装配的过程