|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2007-09-14
今天写了一个Session Bean调用的Demo,可是总是报错java.lang.ClassCastException: $Proxy91,郁闷至极,删掉整个项目重新写,可是问题依然存在。原来EJB接口Jar文件,我放在client项目的web-info/lib目录下了,并且EJB接口jar文件和client同时发布到jboss下,在调用Stateful Bean 就会发生类型冲突。总结一下整理给大家,希望有帮助。 当你的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 接口放置在应用的类路径下。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-09-14
把标题改成 "EJB client调用EJB3 session bean" 更恰当.
|
|
| 返回顶楼 | |
|
最后更新时间:2007-09-14
|
|
| 返回顶楼 | |
|
最后更新时间:2007-09-14
用glassfish好像没什么问题
|
|
| 返回顶楼 | |
|
最后更新时间:2007-09-17
glassfish还没有试过,不知道是否稳定
|
|
| 返回顶楼 | |
浏览 1600 次





