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

06-04-30 xuechen0721
         

  笔者使用的应用服务器从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这个初始化上下文,不懂,请指教该怎么设置?

         

1
banq
2006-04-30 11:22

>那该怎么设置呢?毕竟每次调用时都按第二种方法很麻烦

使用serviceLocator,可见JF应用JdonNews中的serviceLocator

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

由于EJB配置复杂性,建议初学者使用开发工具来写EJB:

1.JBuilder

2.Eclipse + JBossIDE + xDoclet

xuechen0721
2006-04-30 13:00

我使用的是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.xml#ejb-jar_ID"/>

<ejbBindings xmi:id="EnterpriseBeanBinding_1146190824015" jndiName="ejb/com/diablo/PragrammerEntity/PragrammerLocalHome">

<enterpriseBean xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xml#Pragrammer"/>

<ejbRefBindings xmi:id="EjbRefBinding_1146368656250" jndiName="ejb/com/diablo/PragrammerEntity/PragrammerLocalHome">

<bindingEjbRef xmi:type="common:EJBLocalRef" href="META-INF/ejb-jar.xml#EJBLocalRef_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>

xuechen0721
2006-04-30 13:17

重发一下源码

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.xml#ejb-jar_ID"/>
  <ejbBindings xmi:id="EnterpriseBeanBinding_1146190824015" jndiName="ejb/com/diablo/PragrammerEntity/PragrammerLocalHome">
    <enterpriseBean xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xml#Pragrammer"/>
    <ejbRefBindings xmi:id="EjbRefBinding_1146368656250" jndiName="ejb/com/diablo/PragrammerEntity/PragrammerLocalHome">
      <bindingEjbRef xmi:type="common:EJBLocalRef" href="META-INF/ejb-jar.xml#EJBLocalRef_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>


<p>

javaRwx
2010-12-27 18:05

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

使用serviceLocator,可见JF应用JdonNews中的serviceLocator ...

晕~~

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

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