日期:2014-05-19  浏览次数:20707 次

EJB2.1的localhome问题
最近要重构一批代码,某些EJB要改成local访问,于是先动手做了个简单例子做试验,没想到这里就碰了钉子。

首先说明,所有东西不变,只要改用remote和remoteHome接口就完全没问题

我用来试验的容器是glassfish u2

提示一直都是TestLocal not found (NameNotFoundException

客户端Servlet的代码很简单:
Java code

Context ctx = new InitialContext();
Object o = ctx.lookup("ejb/TestLocal");
……


执行到第二句已经出错,后面的什么create()早就免谈。


网上搜到无数解决方案,对我都无效。先把试过的方案先摆一摆:

1. 在war包的WEB-INF里的web.xml里,加入<ejb-local-ref>标签内容如下:
 
XML code

  <ejb-local-ref>
      <ejb-ref-name>ejb/TestLocal</ejb-ref-name>
      <ejb-ref-type>Session</ejb-ref-type>
      <local-home>com.jeff.TestLocalHome</local-home>
      <local>com.jeff.TestLocal</local>
      <ejb-link>TestLocalEJB.jar#TestLocal</ejb-link>
  </ejb-local-ref>


  结果,按照"ejb/TestLocal"或"TestLocal"去lookup,都一样失败。servlet和ejb在同一个ear,但不在同一个jar包里,所以<ejb-link>里才要采用引入jar的方法。

2. 看到有人说一定要在同一个包里才能用到localhome, 于是在同一个包里定义另一个stateless session EJB,并在其ejb-jar配置内容下加上以上同样的XML(ejb-link改成TestLocal),然后在其商业方法中尝试lookup TestLocalHome,结果同样失败。实际上我认为这种说法不过是第一步里ejb-link的一种简单化方案,两者之间没有本质区别。

3. 查找资料,发现本地接口是通过link方法实现的,与JNDI没有关系,因此上述XML应该没错。

4. 尝试servlet以外其他途径,如jsp,独立客户端,pojo调用等等,没用。

论坛不能上传附件,只好把源码/XML一一贴在这里,盼望热心人帮我测试一下,到底哪里出的问题(也许是glassfish的问题?有没有可能用weblogic或jboss试试?)。 下面的代码,尤其是xml我已经试着改过不少地方,所以,希望大家帮忙尽量亲自测试一下, 而不只是指点一些毛病。 如果能通过邮箱把通过测试的源码包发给我那就更感谢了,我的邮箱 : jeff2033333@yahoo.com.sg
分数比较少,请多担待,白读了很久CSDN今天才开始发帖,惭愧。

TestLocalHome:
Java code

package com.jeff;

import javax.ejb.CreateException;
import javax.ejb.EJBLocalHome;

public interface TestLocalHome extends EJBLocalHome {
    public TestLocal create() throws CreateException;
}



TestLocal:
Java code

package com.jeff;

import javax.ejb.EJBLocalObject;

public interface TestLocal extends EJBLocalObject {
    public int get6();
}



TestBean:
Java code

package com.jeff;

import java.rmi.RemoteException;

import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class TestBean implements SessionBean {
    
    public TestBean() {
    }

    public void ejbActivate() throws EJBException, RemoteException {
    }

    public void ejbPassivate() throws EJBException, RemoteException {
    }

    public void ejbRemove() throws EJBException, RemoteException {
    }

    public void setSessionContext(SessionContext arg0) throws EJBException,
            RemoteException {
    }
    
    //business methods;
    
    public int get6() {
        return 6;
    }
}



ejb-jar.xml:
XML code

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBean