论坛首页 Java企业应用论坛

GlassFish中Application Client(应用程序客户端)中使用@EJB

浏览 3352 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-21   最后修改:2009-11-23
最近在研究EJB,刚开始使用的是JBoss4.2。JBoss可以满足开发EJB中的绝大部分需求。但是JBoss4.2不支持@EJB注释在 Servelt中的使用。因为JBoss并不是JavaEE5.0规范的完全实现产品。出于好奇,将服务器更换为GlassFish2.1。

     网上有些关于如何在GlassFish的Application Client(应用程序客户端)中使用@EJB的文章,但是都是简单的几句:

   “appclient -client  ejbClient.jar

     ............................”

    (这在《Beginning EJB.3.Application.Development》一书中也是这样,很简略。)

在研究了2天后,终于可以在Application Client(应用程序客户端)中使用@EJB注解了,要求如下:

第一步:EJB模块部署到GlassFish中

第二步:将客户端打包成jar(这是重点)

              jar文件必备的要点如下(XXX是您的EJB独立客户端的路径):

              1、jar文件必须有Entry Point(即入口),否则:“无法确定XXX中JavaEE模块类型”的错误。

              2、jar文件中不能含有EJB模块的实现,否则:“归档文件XXX似乎有效,但应为应用客户机或企业应用程序”。

第三步:在%GlassFish%\bin\下,调用 appclient -client  XXX.jar
   发表时间:2009-11-22  
我用的jboss-5.1.0.GA,安装了jboss-ejb3-plugin-1.0.18,在servlet 2.5里,可以用@EJB的,不过要把ejb和web的工程打在一个ear文件里才行,我试过可以了!
0 请登录后投票
   发表时间:2009-11-23   最后修改:2009-11-23
yz2yz 写道
我用的jboss-5.1.0.GA,安装了jboss-ejb3-plugin-1.0.18,在servlet 2.5里,可以用@EJB的,不过要把ejb和web的工程打在一个ear文件里才行,我试过可以了!


你说的很对。 在JavaEE  EJB3.0规范中,@EJB注释可以对以下组件进行注释: 

    * Servlets
    * ServletContextListeners
    * Servlet Filters
    * JSF managed beans
    * EJB session bean
    * EJB interceptors
    * JAX-WS service endpoints

然而在JBoss4.2以及JBoss5.0中,都无法实现在Servlet中注入EJB!。(当然借助于插件就可以了!)。


  不过我说的是另外一种情况,即只有在Glassfish中才有的情况。一般独立的客户端(比如JavaSE客户端),调用在JBOSS中的EJB组件时,只能使用JNDI Lookup的方法。而无法使用到JavaEE环境下的依赖注入、以及依赖查找的方式来获取EJB组件。
  然而,GlassFish专门提供了一个工具--- appclient.bat。通过这个工具,一个独立的客户端,可以使用JavaEE环境下才用的特性(当然前提是GlassFish必须启动)。

  新建一个StatelessSessionBean:
 
package app.service;

import javax.ejb.Remote;

@Remote
public interface HelloWorld {
	public String sayHello();
}
  


 
package app.service.impl;

import javax.ejb.Stateless;

import app.service.HelloWorld;

@Stateless(mappedName="ejb/HelloWorld")
public class HelloWorldBean implements HelloWorld {

	@Override
	public String sayHello() {	
		return "你好,GlassFish!";
	}

}
  


   然后建立一个JavaSE的客户端:
 
package app.test;

import javax.ejb.EJB;

import app.service.HelloWorld;

public class TestEJB {

	@EJB(mappedName="ejb/HelloWorld")
	static HelloWorld hello;
	
	void doTest(){
		System.out.println(hello.sayHello());
	}
	
	public static void main(String[] agrs){
		new TestEJB().doTest();
	}
}


注意:
  • static关键字不能缺少,否则会报错!
  • @EJB的第2中形式 @EJB(name=”target” , beanInterface= XXX.class),如何在独立客户端中使用,尚不明确!



相信,这个客户端在JBoss中是无法工作的。但是将TestEJB打成jar包后(如何打包请看原帖),利用GlassFish提供的工具appclient.bat,独立的客户端就可以利用JavaEE提供的服务了!

至于,这个工具有多大的用处,目前尚不明了。本文只是说明一个常见的用法!
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics