今天写了一个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
接口放置在应用的类路径下。
相关推荐
调用真正的业务方法( EJB的Bean 相当于委托类,可以不实现业务接口, 但是方法必须有,为了保险,最好实现) --- 调用中间件服务完成业务; 业务接口的作用, 生成Stub 和 拦截器; 7, EJB3.0的简化: 比 EJB2.0 : ...
5.6.2 开发服务器端程序 223 5.7 本章小结 225 第6章 利用JMS实现企业消息处理 226 6.1 面向消息的架构和JMS概述 227 6.1.1 面向消息的应用架构 227 6.1.2 JMS的基础知识和优势 228 6.1.3 JMS的两个重要版本 229 6.2...
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。 对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上...
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。 对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器...
8 从Servlet中调用EJB 附录A 超文本传输协议 A. 1 MIME A. 2 URI和URL A. 3 HTTP详解 A. 3. 1 建立TCP/IP连接 A. 3. 2 客户端发送请求 A. 3. 3 服务器返回响应 A. 3. 4 HTTP报头 附录B Servlet API
现在,Flex 如何才能通过 BlazeDS 调用 FlexService 接口呢?由于 FlexService 对象已经被 Spring 管理,因此,我们需要编写一个 FlexFactory 告诉 BlazeDS 如何找到 Spring 管理的 FlexService 的实例。flexFactory...
现在,Flex 如何才能通过 BlazeDS 调用 FlexService 接口呢?由于 FlexService 对象已经被 Spring 管理,因此,我们需要编写一个 FlexFactory 告诉 BlazeDS 如何找到 Spring 管理的 FlexService 的实例。flexFactory...
得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI...
这样,远程方法激活可以发生在对等的两端,也可以发生在客户端和服务器之间,只要双方的应用程序都是用Java写的。 4、Java IDL(Java Interface Definition Language) 提供与CORBA(Common Object Request Broker ...
得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI...
服务器端构件可以根据应用需求迅速地加以修改,且构件在网络中的位置和应用无关,因此系统管理员可以很容易地重新配置系统的负载。 Java Servlet Servlet是使用Java Servlet应用程序设计接口(API)及相关类和方法...
5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP...
5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP...
目录 前言 1. 简介 1.1. 概览 1.2. 使用场景 2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 ... 用Java接口定义管理接口 ...
MainApp.exe负责完成对象的创建、组装以及调用工作: using System; namespace IocInCSharp { public class MainApp { public static void Main() { SayHello sayHello = new SayHello(); sayHello....
不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of Responsibility(责任链) 各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个. 设计模式之 Mediator(中介) Mediator ...
5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP...
5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 5.4.2.1. 注册用户自定义的PropertyEditor ...