你的配置文件当中应该有下面的一句
<....
....
<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);
......
<....
....
<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);
......
如果 配置文件中 写的是
<jndi-name>MySessionBean</jndi-name>
那么 context.lookup("MySessionBean"); 返回的也还是 Home 接口吗?还有一个问题
现在 PortableRemoteObject.narrow(ref, MyHome.class); 这一句
抛出了 java.lang.ClassCastException
我觉得这样没有道理啊
可是 不打包进去 就 java.lang.ClassCastException哎 摸不着头脑 还请多多指教
至于异常,你确信是和下面的方式相仿么
FriendsHome home = (FriendsHome)PortableRemoteObject.narrow(ref,FriendsHome.class);
// PortableRemoteObject.narrow的功能是将context.lookup(); 获取得对象转换为相应的Home接口.你的异常是class转换异常,请注意你lookup()的是不是MyHome接口的JNDI地址
我想代码是可以确定真确的
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> 里面的是什么意思? 书上没有提到
好像也没怎么设置 有点莫名其妙但是又出现了另一个问题 真是令我哭笑不得我的包结构是这样的
+-- Client
| |
| +-- MyTestBeanTestClient
|
+-- MyBeanTest
|
+-- interface MyTest extends javax.ejb.EJBObject
|
+-- interface MyTestHome extends javax.ejb.EJBHome
|
+-- class MyTestBean implements SessionBean我想把 Home接口 以及 EJBObject接口 和客户端放在一起 把两个包分开
却不行 还是那个异常
所以现在又要把 MyBeanTest 里面的 三个文件 import 到 MyTestBeanTestClient 里或者 就请你告诉我怎样手工完成
<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中的所有方法都必须在事务中.
这里的"*"代表所有方法.你可以在这里为每一个方法都定义一个事务属性.
客户端包括: MyTestBeanTestClient,MyTest ,MyTestHome
bean包包括: MyTest ,MyTestHome, MyTestBean
可以编写一个批处理自动完成打包装配的过程