关于jboss下 web 客户端如何访问EJB的问题!!!!

code_man 2004-03-30 08:39:30
我做了一个简单的无状态会话EJB,想通过一个web客户端servlet访问.开发环境是eclipse +lomboz+|jboss3.08。ejb模块和web 模块都在一个project下。模块发布都没有问题。调用servlet,出现Naming Exception caught:javax.naming.NameNotFoundException: ejb not bound
web.xml相关配置如下:
<servlet>
<servlet-name>TestHello</servlet-name>
<servlet-class>com.ejbstudy.TestHello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestHello</servlet-name>
<url-pattern>TestHello</url-pattern>
</servlet-mapping>
ejb-jar相关配置如下:
<enterprise-beans>

<!-- Session Beans -->
<session >
<description><![CDATA[]]></description>

<ejb-name>Hello</ejb-name>

<home>com.ejbstudy.HelloHome</home>
<remote>com.ejbstudy.Hello</remote>
<local-home>com.ejbstudy.HelloLocalHome</local-home>
<local>com.ejbstudy.HelloLocal</local>
<ejb-class>com.ejbstudy.HelloSession</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<enterprise-beans>
jboss.xml相关内容如下:
<session>
<ejb-name>Hello</ejb-name>
<jndi-name>HelloBean</jndi-name>
<local-jndi-name>HelloLocal</local-jndi-name>

</session>
Servlet是如下调用的:
InitialContext ctx=new InitialContext();
Object objRef = ctx.lookup("Hello");
// 主接口
HelloHome
home=(HelloHome)javax.rmi.PortableRemoteObject.narrow(
objRef,HelloHome.class);
请问为什么找不到?
说明:servlet中改为ctx.lookup("HelloBean");也不行。
请教高手!!!!!!!!!!
...全文
360 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
code_man 2004-03-30
  • 打赏
  • 举报
回复
大哥,这篇文章我也授缩到了,不行啊
讲的针对性点,好不好?
WAPQQ 2004-03-30
  • 打赏
  • 举报
回复
JBoss3.0中基本的ejb配置和部署
根据J2EE规范的要求,一个基本的ejb jar包使用的描述文件是ejb-jar.xml。web应用的war包使用的是web.xml。企业应用的ear包使用的是application.xml。这些配置文件都是中性的和平台无关的。同时应用服务器可以使用一些其他的配置文件用于描述特定服务器的相关信息。在JBoss中这样的文件有jboss.xml,jboss-web.xml等。JBoss容器中这些文件不是必须的,如果提供了那么jboss.xml和ejb-jar.xml放在同一目录下,jboss-web.xml和web.xml放在同一目录下。关于jboss.xml和jboss-web.xml的规范请参考JBoss安装目录下docs/dtd/目录下的对应的DTD文件。
2.1 JBoss中关于EJB客户端的配置:
调用EJB的客户端可以是JSP、Servlet或客户端应用程序。如果客户端和服务器不在同一个Java VM上,那么在客户端必须提供一个jndi.properties文件告诉客户端进行有关JNDI命名服务的信息,并且把这个文件所在目录设定到环境变量classpath中。
以下是一个jndi.properties的样例:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099 (服务器地址和端口号)
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
通过这个文件和JBoss的一些客户端类库,就可以使用JBoss提供的EJB对象服务了。
2.2 JBoss中部署EJB:
首先介绍JBoss容器中部署各类EJB对象的两种方法。下面的演示以Session Bean为例,客户端是一个本机上的web应用。这里不对演示程序进行具体介绍。
第一种方式:
把开发好的ejb jar包和web应用的war包公共放在deploy目录下。
演示1:不需要jboss.xml文件和其他任何特殊的设置。
ejb-jar.xml:
<ejb-jar>
······
<ejb-name>ejbtest</ejb-name>
······
</ejb-jar>
客户端:web应用中对web.xml不需要添加ejb信息,不需要jboss-web.xml文件。引用ejb对象的jsp文件如下:
······
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("ejbtest"); //使用<ejb-name> beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
······

演示2:使用jboss.xml文件。
在缺省情况下JBoss的JNDI服务将通过ejb-jar.xml中<ejb-name>XXX</ejb-name>中的XXX来使用EJB的home interface。但是如果有多个ejb对象在相同的ejb jar包中,在ejb-jar.xml中通过<ejb-name>XXX</ejb-name>就可能不能很好的表示某一个ejb对象,所以一般我们希望可以提供一些附加的信息,例如采用这样的格式"[应用名]/[bean名]"来引用一个EJB对象。这时JNDI服务就可能不能正确地找到你的ejb对象,我们就需要使用jboss.xml文件,通过它实现jndi 名到ejb名的重定向。这个文件必须和ejb-jar.xml一起放到META-INFO目录下。
ejb-jar.xml:
<ejb-jar>
······
<ejb-name>ejbtest</ejb-name>
······
</ejb-jar>
jboss.xml:
<jboss>
<ejb-name>ejbtest</ejb-name>
<jndi-name>example/ejbtest</jndi-name>
</jboss>

客户端:需要使用新的jndi名进行ejb定位。
······
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("example/ejbtest"); //使用<jndi-name> beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
······
第二种方式:
把ejb和web应用包装成一个企业应用包。部署ear时可以简单地把通过application.xml描述ejb jar包和web应用的war包,同样在web.war中不需要提供特殊的信息就可以和第一种方式一样使用ejb对象。客户端代码也不需要进行改动。这里不再举例说明。
此外我们可以进行更进一步的部署,这时需要使用到web.xml和jboss-web.xml。jboss-web.xml是JBoss提供的一个针对web应用进行配置的文件。jboss-web.xml和web.xml一起放在web应用的WEB-INF目录下。
演示1:改动web.xml文件,添加<ejb-ref>标记,不使用jboss-web.xml文件。
(注意<ejb-ref>包括内部引用和外部引用。如果是同一个单元的可以通过<ejb-link>直接进行引用,而不用提供其他信息。)
web.xml:
······
<ejb-ref>
<ejb-ref-name>ejb/ejbtest</ejb-ref-name> <!--采用sun推荐的命名方式-->
<ejb-ref-type>Session</ejb-ref-type>
<home>org.zcx.test.zcxejb1Home</home>
<remote>org.zcx.test.zcxejb1</remote>
<ejb-link>ejbtest</ejb-link> <!--必须和被应用的ejb-name匹配-->
</ejb-ref>
······
客户端:由于在web.xml中引入ejb引用描述这时ejb定位发生了变化:
······
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("java:comp/env/ ejb/ejbtest "); //使用java:comp/env命名空间 beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
······

演示2:联合使用web.xml和jboss-web.xml
web.xml
······
<ejb-ref>
<ejb-ref-name>ejb/ejbtest</ejb-ref-name> <!--采用sun推荐的命名方式-->
<ejb-ref-type>Session</ejb-ref-type>
<home>org.zcx.test.zcxejb1Home</home>
<remote>org.zcx.test.zcxejb1</remote>
</ejb-ref>
······
jboss-web.xml
<ejb-ref>
<ejb-ref-name> ejb/ejbtest </ejb-ref-name>
<jndi-name> example/ejbtest </jndi-name> <!-- 这里对应ejb对象的jndi名-->
</ejb-ref>
客户端:
nitialContext ctx = new InitialContext();
Object objref = ctx.lookup("java:comp/env/ ejb/ejbtest "); beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);

以上的所有演示说明了ejb-jar.xml、jboss.xml、web.xml、jboss-web.xml之间的基本关系和它们的使用方式。它们是部署各类ejb对象的关键文件。接下来介绍针对不同类型的ejb对象所需要的特殊配置。
hup 2004-03-30
  • 打赏
  • 举报
回复

不要自己写JNDI试试:

private com.winton.cmp.TestHome getHome() throws NamingException {
return (com.winton.cmp.TestHome) getContext().lookup(
com.winton.cmp.TestHome.JNDI_NAME);
tanguangbin 2004-03-30
  • 打赏
  • 举报
回复

JNDI 名字写错了.
这样写:

InitialContext ctx=new InitialContext();
Object objRef = ctx.lookup("HelloLocal");//
// 主接口
HelloHome
home=(HelloHome)javax.rmi.PortableRemoteObject.narrow(
objRef,HelloHome.class);

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧