关于EJB初始化上下文的一点疑问

  笔者使用的应用服务器从Weblogic到现在的WebSphere,在EJB的调用问题上始终存在的一点疑虑,今天说出来和大家探讨一下。
  在远程调用EJB时,有一个初始化环境的问题,有以下两种代码:
一、Context ctx = new InitialContext();
二、String initialFactory = "com.ibm.websphere.naming.WsnInitialContextFactory";
 String initialURL = "iiop://localhost:2809";
 Hashtable env = new Hashtable();
 env.put(Context.PROVIDER_URL, initialURL);
  env.put(Context.INITIAL_CONTEXT_FACTORY,initialFactory);
 Context ctx = new InitialContext(env);

笔者也看了很多这方面的书,大多数书中都是按照第一种的写法,大概都这样论述,说EJB已经在容器中初始化,所以只需调用默认的初始化环境即可,但是却都不介绍怎么在容器中初始化这些信息。根据笔者的使用经验,不设置容器的情况下(其实笔者也不知道怎么设置)使用第一种方法都提示不能初始化上下文。
  笔者现在都使用第二种硬编码的方式,现在想请教大家,如果想设置EJB的容器,利用第一种方法,那该怎么设置呢?毕竟每次调用时都按第二种方法很麻烦。
  还有一个就是JNDI的书写问题有两种:(比如笔者创建的EJB名为HelloEntity)一种是ejb/HelloEntity,还有一种是java:comp/env/ejb/HelloEntity
请问java:comp/env怎么设置,在哪个配置文件中设置?笔者在WebSphere的配置文件ibm-ejb-jar-bnd.xmi中设置了java:comp/env,可在使用时还是报错,说找不到java这个初始化上下文,不懂,请指教该怎么设置?

>那该怎么设置呢?毕竟每次调用时都按第二种方法很麻烦
使用serviceLocator,可见JF应用JdonNews中的serviceLocator

java:comp/env/是环境变量,需要在标准的ejb-jar.xml中设置,再指向JNDI名称。

由于EJB配置复杂性,建议初学者使用开发工具来写EJB:
1.JBuilder
2.Eclipse + JBossIDE + xDoclet

我使用的是wsad(也就是Eclipse,IBM集成的),在配置文件中有两个文件:ejb-jar.xml,ibm-ejb-jar-bnd.xmi;
在ibm-ejb-jar-bnd.xmi中指定了我的EJB和数据源的JNDI名。
可是我在ejb-jar.xml不知道怎么设置这个java:comp/env,还向banq大哥和各位请教,给个详细的设置方法。
下面附上两个配置文件:
ejb-jar.xml
<?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 id="ejb-jar_ID">
<display-name>Programmer</display-name>
<enterprise-beans>
<entity id="Pragrammer">
<ejb-name>Pragrammer</ejb-name>
<local-home>com.diablo.PragrammerEntity.PragrammerLocalHome</local-home>
<local>com.diablo.PragrammerEntity.PragrammerLocal</local>
<ejb-class>com.diablo.PragrammerEntity.PragrammerBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>com.diablo.PragrammerEntity.PragrammerKey</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Pragrammer</abstract-schema-name>
<cmp-field id="CMPAttribute_1146190999921">
<field-name>id</field-name>
</cmp-field>
<cmp-field id="CMPAttribute_1146190999922">
<field-name>firstName</field-name>
</cmp-field>
<cmp-field id="CMPAttribute_1146190999923">
<field-name>lastName</field-name>
</cmp-field>
<ejb-local-ref id="EJBLocalRef_1146368656250">
//下面是我后来加的EJB引用,不知道有什么用??
<ejb-ref-name>java:comp/env/ejb/com/diablo/PragrammerEntity/PragrammerLocalHome</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>com.diablo.PragrammerEntity.PragrammerLocalHome</local-home>
<local>com.diablo.PragrammerEntity.PragrammerLocal</local>
<ejb-link>Pragrammer</ejb-link>
</ejb-local-ref>
</entity>
</enterprise-beans>
</ejb-jar>

ibm-ejb-jar-bnd.xmi
<?xml version="1.0" encoding="UTF-8"?>
<ejbbnd:EJBJarBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ejbbnd="ejbbnd.xmi" xmlns:ejb="ejb.xmi" xmlns:common="common.xmi" xmi:id="EJBJarBinding_1146190824015" currentBackendId="DB2UDBNT_V8_1">
<ejbJar href="META-INF/ejb-jar.xmlejb-jar_ID"/>
<ejbBindings xmi:id="EnterpriseBeanBinding_1146190824015" jndiName="ejb/com/diablo/PragrammerEntity/PragrammerLocalHome">
<enterpriseBean xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xmlPragrammer"/>
<ejbRefBindings xmi:id="EjbRefBinding_1146368656250" jndiName="ejb/com/diablo/PragrammerEntity/PragrammerLocalHome">
<bindingEjbRef xmi:type="common:EJBLocalRef" href="META-INF/ejb-jar.xmlEJBLocalRef_1146368656250"/>
</ejbRefBindings>
<cmpConnectionFactory xmi:id="CMPConnectionFactoryBinding_1146191116484" jndiName="jdbc/ejb/programmer"/>
</ejbBindings>
<defaultCMPConnectionFactory xmi:id="CMPConnectionFactoryBinding_1146190824015" jndiName="jdbc/Default" resAuth="Per_Connection_Factory"/>
</ejbbnd:EJBJarBinding>

重发一下源码


ibm-ejb-jar-bnd.xmi

<?xml version="1.0" encoding="UTF-8"?>
<ejbbnd:EJBJarBinding xmi:version=
"2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ejbbnd="ejbbnd.xmi" xmlns:ejb="ejb.xmi" xmlns:common="common.xmi" xmi:id="EJBJarBinding_1146190824015" currentBackendId="DB2UDBNT_V8_1">
<ejbJar href=
"META-INF/ejb-jar.xmlejb-jar_ID"/>
<ejbBindings xmi:id=
"EnterpriseBeanBinding_1146190824015" jndiName="ejb/com/diablo/PragrammerEntity/PragrammerLocalHome">
<enterpriseBean xmi:type=
"ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xmlPragrammer"/>
<ejbRefBindings xmi:id=
"EjbRefBinding_1146368656250" jndiName="ejb/com/diablo/PragrammerEntity/PragrammerLocalHome">
<bindingEjbRef xmi:type=
"common:EJBLocalRef" href="META-INF/ejb-jar.xmlEJBLocalRef_1146368656250"/>
</ejbRefBindings>
<cmpConnectionFactory xmi:id=
"CMPConnectionFactoryBinding_1146191116484" jndiName="jdbc/ejb/programmer"/>
</ejbBindings>
<defaultCMPConnectionFactory xmi:id=
"CMPConnectionFactoryBinding_1146190824015" jndiName="jdbc/Default" resAuth="Per_Connection_Factory"/>
</ejbbnd:EJBJarBinding>


ejb-jar.xml

<?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 id=
"ejb-jar_ID">
<display-name>Programmer</display-name>
<enterprise-beans>
<entity id=
"Pragrammer">
<ejb-name>Pragrammer</ejb-name>
<local-home>com.diablo.PragrammerEntity.PragrammerLocalHome</local-home>
<local>com.diablo.PragrammerEntity.PragrammerLocal</local>
<ejb-class>com.diablo.PragrammerEntity.PragrammerBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>com.diablo.PragrammerEntity.PragrammerKey</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Pragrammer</abstract-schema-name>
<cmp-field id=
"CMPAttribute_1146190999921">
<field-name>id</field-name>
</cmp-field>
<cmp-field id=
"CMPAttribute_1146190999922">
<field-name>firstName</field-name>
</cmp-field>
<cmp-field id=
"CMPAttribute_1146190999923">
<field-name>lastName</field-name>
</cmp-field>
<ejb-local-ref id=
"EJBLocalRef_1146368656250">
//下面是我后来加的什么EJB引用,不知道有什么用???
<ejb-ref-name>java:comp/env/ejb/com/diablo/PragrammerEntity/PragrammerLocalHome</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>com.diablo.PragrammerEntity.PragrammerLocalHome</local-home>
<local>com.diablo.PragrammerEntity.PragrammerLocal</local>
<ejb-link>Pragrammer</ejb-link>
</ejb-local-ref>
</entity>
</enterprise-beans>
</ejb-jar>


2006年04月30日 11:22 "banq"的内容
>那该怎么设置呢?毕竟每次调用时都按第二种方法很麻烦
使用serviceLocator,可见JF应用JdonNews中的serviceLocator ...

晕~~
这种方法只能支持在同一jvm下调用的情况,如果EJB服务和客户端部署在不同服务器就干瞪眼了~~~~~

所以最好还是写两种方法供选择性的调用