在独立的Java应用程序中访问JBoss服务器上的EJB实例是一个常见的需求。本文将介绍如何通过JNDI查找和EJB注入两种方法来实现这一目标。
首先,需要确保应用程序包含了以下JBoss客户端库:
jbossall-client.jar
jboss-ejb3-client.jar
此外,还需要将EJB模块的引用添加到应用程序中。
在客户端模块中获取EJB实例有两种方法:
在JBoss-4.x版本中,不支持在servlets或应用客户端中使用EJB注入,这意味着@EJB
注解将不起作用。从JBoss-5版本开始支持此功能。
对于任何类型的EJB客户端(无论是独立的还是web servlet),如果它没有部署在与EJB相同的ear归档中,必须设置JNDI应用程序所需的环境。
为了初始化InitialContext
对象,有以下选项:
创建一个名为jndi.properties
的文件,并将其保存到应用程序类路径中。添加以下行:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=JBOSS_IP:1099
其中JBOSS_IP
是托管EJB的JBoss服务器的IP地址,1099是JBoss服务器的JNDI端口。
导航到项目属性,从类别中选择运行,在VM选项框中输入以下行:
-Djava.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
-Djava.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
-Djava.naming.provider.url=JBOSS_IP:1099
在IDE(这里使用的是NetBeans)中,创建一个新的Java应用程序项目。
将上述提到的依赖项添加到项目库中。
使用上述两种方法中的任何一种配置JNDI设置,这里使用的是保存在C盘根目录的jndi.properties
。
使用Properties
类加载JNDI属性。
Properties props = new Properties();
props.load(new FileInputStream("c://jndi.properties"));
初始化InitialContext
实例,将Properties
类实例传递给构造函数。
InitialContext ctx = new InitialContext(props);
使用InitialContext
实例的lookup
方法查找EJB模块中的远程对象并返回其实例。为此,将会话Bean的远程或本地接口的JNDI名称传递给lookup
方法,对于JBoss,JNDI名称模式如下:
EAR名称/EJB实现组件/远程或本地
如果EJB部署到JAR归档而不是EAR归档,则JNDI名称模式为:
EJB实现组件/远程或本地
try {
Properties props = new Properties();
props.load(new FileInputStream("c://jndi.properties"));
InitialContext ctx = new InitialContext(props);
SalaryCalc a = (SalaryCalc) ctx.lookup("SalaryCalc Bean/remote");
a.doaction();
} catch(IOException ex) {
System.out.println("IOException : " + ex.getMessage());
} catch(NamingException ex) {
System.out.println("NamingException : " + ex.getMessage());
}