你好,banq,请教一个EJB的问题

06-06-14 xysniper
在得到Home实例时:

第一:Context init = new InitialContext();

Context tx = (Context) init.lookup("java:comp/env");

Object obj = tx.lookup("ejb/HelloWorld");

第二:Context init = new InitialContext();

Object obj = tx.lookup("java:comp/env/ejb/HelloWorld");

第三:Context init = new InitialContext();

Object obj = tx.lookup("ejb/HelloWorld");

请问以上三种是不是得到HOME实例的三种方式,其中java:comp/env是什么意思呀?

多谢指导

banq
2006-06-14 15:40
java:comp/env是J2EE规定的JNDI写法字符串。

xysniper
2006-06-14 17:24
我也知道,只是什么意思?还有就是那三种写法,为什么有时候用第一种,有时候用第二种,有时候用第三种,我在网上看到人家这么用的,请问什么情况下,有哪一种?这三种有什么区别?谢谢答复

banq
2006-06-14 17:26
带 java:comp/env是标准JNDI写法,不带是根据具体容器如Weblogic写法或JBoss写法。

xysniper
2006-06-14 17:30
谢谢答复,我用的是weblogic8,如果带java:comp/env的话,就出错,如果不带的话,就没有问题,请问是什么原因?

xysniper
2006-06-14 17:38
出的错是:

javax.naming.NameNotFoundException: While trying to look up ejb/HelloWorld in java:comp/env.; remaining name 'ejb/HelloWorld'

- Could not complete request

java.lang.NullPointerException

at com.moloon.service.ejb.TestEJB.invokeEjb(TestEJB.java:69)

at com.moloon.service.springmvc.TestEJBController.handleRequest(TestEJBController.java:20)

at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:675)

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:623)

at org.springframework.web.servlet.FrameworkServlet.serviceWrapper(FrameworkServlet.java:384)

at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:344)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1072)

at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)

at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)

at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6981)

at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)

at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)

at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3892)

at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2766)

at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)

at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)

<2006-6-14 下午05时34分32秒 CST> <Error> <HTTP> <BEA-101020> <[ServletContext(id=41001,name=J2EE_Web,context-path=/J2EE_Web)] Servlet failed with Exception

java.lang.NullPointerException

at com.moloon.service.ejb.TestEJB.invokeEjb(TestEJB.java:69)

at com.moloon.service.springmvc.TestEJBController.handleRequest(TestEJBController.java:20)

at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:675)

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:623)

at org.springframework.web.servlet.FrameworkServlet.serviceWrapper(FrameworkServlet.java:384)

at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:344)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1072)

at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)

at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)

at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6981)

at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)

at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)

at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3892)

at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2766)

at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)

at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)

>

banq
2006-06-15 09:05
>如果带java:comp/env的话

这中叫EJB Reference,是比较复杂的,java:comp/env后面的字符串必须在当前EJB的ejb-jar.xml中的ejb-local-reference中定义。

而如果不带java:comp/env,那么那个JNDI就无需上面一样的定义。

使用EJB Reference是为了让调用者和被调用者的JNDI名解耦,因为JNDI名是和容器相关,所以,为屏蔽容器的特殊性,增加移植性,使用reference有必要。

xuechen0721
2006-06-15 09:33
如seej2ee兄遇到的问题也困扰我很久。

banq说的很对:带 java:comp/env是标准JNDI写法,不带是根据具体容器如Weblogic写法或JBoss写法。此举体现在java:comp/env的配置是写在ejb-jar.xml(J2EE规范)中的,而不带此表头的jndi名是写在weblogic或jboss的配置文件中的(如weblogic中为weblogic-ejb-jar.xml)。

我也一直在研究怎么使用标准的java:comp/env样式的jndi调用EJB。

我的使用经验偶得,大家参考:

现有三个EJB:1、facade sessionBean

2、bussion sessionBean

3、bussion entityBean

我的意图是使用1调用2、3两个本地bean(我使用的是websphere)

当然2、3两个bean由websphere生成的jndi名远程调用可以使用(就是无java:comp/env的调用)。

在1这个bean 中设置2、3连个bean的引用,ejb-jar.xml引用配置代码如下:

<ejb-local-ref id="EJBLocalRef_1147745685937">
<ejb-ref-name>ejb/Pragrammer</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>Programmer.jarPragrammer</ejb-link>
</ejb-local-ref>

<ejb-local-ref id="EJBLocalRef_1147745789937">
<ejb-ref-name>ejb/Hello</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>com.diablo.HelloLocalHome</local-home>
<local>com.diablo.HelloLocal</local>
<ejb-link>HelloLocalTest.jarHello</ejb-link>
</ejb-local-ref>
<p>

注意其中的两个ejb-ref-name:ejb/Hello和ejb/Pragrammer

在1这个bean中调用2、3连个bean时,就可使用带java:comp/env的jndi:

Object obj = ctx.lookup("java:comp/env/ejb/Hello");

Object obj = ctx.lookup("java:comp/env/ejb/Pragrammer");

能成功调用。

一点心得,供大家参考!

猜你喜欢