EJB2.1的localhome问题
最近要重构一批代码,某些EJB要改成local访问,于是先动手做了个简单例子做试验,没想到这里就碰了钉子。
首先说明,所有东西不变,只要改用remote和remoteHome接口就完全没问题
我用来试验的容器是glassfish u2
提示一直都是TestLocal not found (NameNotFoundException)
客户端Servlet的代码很简单:
Context ctx = new InitialContext();Object o = ctx.lookup("ejb/TestLocal");……<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>
package com.jeff;import javax.ejb.CreateException;import javax.ejb.EJBLocalHome;public interface TestLocalHome extends EJBLocalHome { public TestLocal create() throws CreateException;}package com.jeff;import javax.ejb.EJBLocalObject;public interface TestLocal extends EJBLocalObject { public int get6();}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; }}<?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> <ejb-name>TestLocal</ejb-name> <local-home>com.jeff.TestLocalHome</local-home> <local>com.jeff.TestLocal</local> <ejb-class>com.jeff.TestBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans></ejb-jar>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sun-ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Application Server 8.1 EJB 2.1//EN' 'http://www.sun.com/software/appserver/dtds/sun-ejb-jar_2_1-1.dtd'> <sun-ejb-jar> <enterprise-beans> <ejb> <ejb-name>TestLocal</ejb-name> <jndi-name>ejb/TestLocal</jndi-name> </ejb> </enterprise-beans></sun-ejb-jar>
package com.jeff;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;import javax.rmi.PortableRemoteObject;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DoTest extends HttpServlet { public DoTest() { super(); } public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { TestHome home1; TestLocalHome home2; Test test1; TestLocal test2; String jndiName = "ejb/Test"; String localLookupName = "ejb/TestLocal"; try { Context ctx = new InitialContext(); if ("true".equals(request.getParameter("remote"))) { home1 = (TestHome)PortableRemoteObject.narrow(ctx.lookup(jndiName), TestHome.class); test1 = home1.create(); System.out.println(test1.get6()); } else { Object o = ctx.lookup(localLookupName); home2 = (TestLocalHome) o; test2 = home2.create(); System.out.println(test2.get6()); } } catch (Exception e) { e.printStackTrace(); } } public void init() throws ServletException { // Put your code here }}<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <description>DotestServlet</description> <display-name>DotestServlet</display-name> <servlet-name>DoTest</servlet-name> <servlet-class>com.jeff.DoTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>DoTest</servlet-name> <url-pattern>/servlet/DoTest</url-pattern> </servlet-mapping> <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></web-app>
或者源文件发我邮箱ming_303@126.com,我跑跑看,这上面贴太多看的我眼花