请教这个jndi是怎么查找的

05-12-14 woodworm
petstore的代码里。

package com.sun.j2ee.blueprints.petstore.tools.populate;

class CustomerPopulator

里面有这样一行code

InitialContext context = new InitialContext();
          customerHome = (CustomerLocalHome) context.lookup("java:comp/env/ejb/Customer");
<p>

==============================

相关文件web.xml里有

 <ejb-local-ref>
    <ejb-ref-name>ejb/Customer</ejb-ref-name>
    <ejb-ref-type>Entity</ejb-ref-type>
    <local-home>com.sun.j2ee.blueprints.customer.ejb.CustomerLocalHome</local-home>
    <local>com.sun.j2ee.blueprints.customer.ejb.CustomerLocal</local>
    <ejb-link>CustomerEJB</ejb-link>
  </ejb-local-ref>
<p>

===============================

ejb-jar.xml里有

    <entity>
      <display-name>CustomerEB</display-name>
      <ejb-name>CustomerEJB</ejb-name>
<p>

================================

请问程序里的lookup是找到了web.xml里的ejb/Customer再转而找到ejb-jar.xml里的CustomerEJB吗?

如果这样的话,我看到有的书上说web.xml里的<ejb-ref>设定的不是jndi名字而是参考名。那么如果在比如j2ee ri的辅助DD文件sun-ejb=jar.xml里有

<ejb>
      <ejb-name>CustomerEJB</ejb-name>
      <jndi-name>ejb/petstore/customer/Customer</jndi-name>
<p>

为什么lookup方法找的不是ejb/petstore/customer/Customer这个jndi名字,而是ejb-ref名字。换句话说这个ejb-ref设定的名字跟jndi名字到底什么区别呢?

现在越看越糊涂了。请高人指点一下。谢谢

banq
2005-12-15 11:42
1.调用者程序:context.lookup("java:comp/env/ejb/Customer");

这说明被调用者的JNDI ref名称是ejb/Customer

2.在与容器相关的配置文件,jboss.xml或weblogic.xml/sun-ejb-jar.xml一般以容器命名的文件中有"被调用者的JNDI ref名称"定义:

<ejb>
      <ejb-name>CustomerEJB</ejb-name>
      <jndi-name>ejb/Customer</jndi-name>

<p>

当然同时,在调用者的配置里(如果调用者在web层是web.xml,如果是EJB,则在ejb-jar.xml):

<ejb-local-ref>
    <ejb-ref-name>ejb/Customer</ejb-ref-name>
    <ejb-ref-type>Entity</ejb-ref-type>
    <local-home>com.sun.j2ee.blueprints.customer.ejb.CustomerLocalHome</local-home>
     <local>com.sun.j2ee.blueprints.customer.ejb.CustomerLocal</local>    <ejb-link>CustomerEJB</ejb-link>
  </ejb-local-ref>
<p>

因此你的例子中,调用者是在Web层,那么JNDI ref名称不是jboss.xml而应该是jboss-web.xml

使用JBoss学习EJB,SUN的太乱了,现在产品才都开源,已经来不及了,不知当初做什么去了。

猜你喜欢