当你的EJB3是deploy to jboss的情况下,ejb client调用EJB3分两种情况:
1)
发布在
jboss
的
web app
作为
client
来调用
EJB
EJB和调用EJB的WEB 应用都发布在Jboss 集成环境下。在Jboss下发布WEB 应用,需要把WEB 应用打包成war 文件。另外
在此环境下调用EJB 不需要把EJB 的接口类放入/WEB-INF/classes/目录中,否则在调用Stateful Bean 就会发生类型冲突,引发下面的例外
java.lang.ClassCastException: $Proxy84
org.apache.jsp.StatefulBeanTest_jsp._jspService(org.apache.jsp.StatefulBeanTest_jsp:55)
如果EJB和调用EJB的WEB 应用都发布在Jboss 集成环境下,那么EJB的Local或Remote接口都可以被调用
发布在Jboss 下的客户端不需要明确设置JNDI 访问的上下文环境,可以直接通过
InitialContext ctx = new InitialContext()
获得上下文环境,容器会自动赋给InitialContext 正确的环境,例如:
InitialContext ctx =
new
InitialContext();
//
客户端和jboss运行在同一个jvm,不需要传入props
HelloWorld helloworld = (HelloWorld) ctx.lookup(
"HelloWorldBean/remote"
);
如果硬给
InitialContext
设置了访问属性,反而会带来不可移植的问题,因为你的应用有可能部署在weblogic 等应用服务器。(
本教程考虑到部分同学可能需要在独立的
J2se
中调用
EJB
,为了教学的方便,把访问属性都设上了,这样不管在
jboss
、
j2se
或独立
tomcat
,都能获得正确的
InitialContext)
2)
在单独的
Tomcat
或
J2SE
(如
junit test
)中调用
EJB
在正式的生产环境下,大部分调用EJB 的客户端可能是单独的Tomcat 或Resin。下面介绍如何在单独的Tomcat服务器中调用EJB。
在单独的
Tomcat
服务器中调用
EJB
需要有以下步骤:
A)
把调用
EJB
所依赖的
Jar
包拷贝到
tomcat
下的
/shared/lib
目录或
WEB
应用的
WEB-INF/lib
下
,
所依赖的
Jar
在
jboss
安装目录的
client
目录下。你可以在eclipse里设置一个自定义的library “ejb3 library”,把这些jars都添加到该library里,然后在你的EJB project里把“ejb3 library” add to classpath
B) 把EJB 接口拷贝到应用的/WEB-INF/classes/目录下
C) 客户端访问EJB 时必须明确设置InitialContext 环境属性,代码如下:
Properties props =
new
Properties();
props.setProperty(
"java.naming.factory.initial"
,
"org.jnp.interfaces.NamingContextFactory"
);
props.setProperty(
"java.naming.provider.url"
,
"localhost:1099"
);
props.setProperty(
"java.naming.factory.url.pkgs"
,
"org.jboss.naming"
);
InitialContext ctx =
new
InitialContext(props);
//
客户端和jboss运行在同一个jvm,不需要传入props
HelloWorld helloworld = (HelloWorld) ctx.lookup(
"HelloWorldBean/remote"
);
Tip:
除了上面通过硬编码设置环境属性的方式外,还可以在应用的
classpath
下放置一个
jndi.properties
文件
注意:在单独的tomcat和J2SE里不能调用
EJB
的
Local
接口,因为他与
JBOSS
不在同一个
VM
中。
J2se
中调用
EJB3
同样需要把上述
jar
及
EJB
接口放置在应用的类路径下。(如果是JBoss,则需要把JBoss_HOME/client下的 jbossall-client.jar 和jnp_client.jar引入到你的工程里)