调用EJB远端接口

今天写了一个Session Bean调用的Demo,可是总是报错 java.lang.ClassCastException: $Proxy91,郁闷至极,删掉整个项目重新写,可是问题依然存在。原来EJB接口Jar文件,我放在client项目的web-info/lib目录 下了,并且EJB接口jar文件和client同时发布到jboss下, 在调用 Stateful Bean 就会发生类型冲突。总结一下整理给大家,希望有帮助。

当你的 EJB3deploy to jboss 的情况下, EJB client 调用 EJB3 分两种情况:

1) 发布在 jboss web app 作为 client 来调用 EJB

EJB 和调用 EJBWEB 应用都发布在 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 和调用 EJBWEB 应用都发布在 Jboss 集成环境下,那么 EJBLocalRemote 接口都可以被调用

发布在 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 ,为了教学的方便,把访问属性都设上了,这样不管在 jbossj2se 或独立 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, 所依赖的 Jarjboss 安装目录的 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 文件

 

注意:在单独的 tomcatJ2SE 里不能调用 EJB Local 接口,因为他与 JBOSS 不在同一个 VM 中。 J2se 中调用 EJB3 同样需要把上述 jar EJB 接口放置在应用的类路径下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值