今天写了一个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接口,这个接口定义了可供远程调用的方法。例如: ```java import javax.ejb.Remote; @Remote public interface MyRemoteService { String doSomething(String input); } ``` 然后,...
3. **调用业务方法**: 客户端通过Remote接口调用EJB的业务方法。对于Entity Bean,客户端通常通过查找来获取现有对象,而不是创建。 4. **容器管理**: EJB容器在调用实际的bean实例前,会进行一系列容器管理操作,如...
总结来说,这个教程提供了使用C++通过CORBA调用EJB的详细步骤,包括生成IDL文件、创建C++ Stub、初始化ORB、解析和调用EJB方法。理解这个过程对于开发者来说是至关重要的,因为它涉及到多个中间件技术的集成,包括...
1. **创建JNDI上下文**:在服务器端,使用`InitialContext`创建JNDI上下文并绑定远程对象。 2. **查找远程对象**:在客户端,同样通过`InitialContext`查找JNDI树中的远程对象。 3. **调用远程方法**:找到远程对象...
- 一旦有了EJB的远程引用,客户端就可以像调用本地方法一样调用EJB的方法,实际上,这一切都在后台由容器处理,包括序列化参数,通过网络发送,反序列化并执行方法,最后将结果返回给客户端。 4. **案例分析**: ...
本资源详细介绍了如何利用C++作为客户端,通过CORBA(Common Object Request Broker Architecture)中间件来调用EJB组件,实现远程方法调用。 首先,我们要理解C++和EJB。C++是一种静态类型的、编译式的、通用的、...
客户端程序用于调用EJB服务器端提供的服务。这里简要介绍客户端程序的编写方法: 1. **客户端代码**: - 客户端需要通过 JNDI 查找服务器端的bean,并获取其远程接口实例。 - 示例代码: ```java ...
### 分布式对象与EJB的基本概念及调用机制 #### 一、分布式对象概述 分布式对象技术是一种软件设计模式,允许对象在其方法被远程调用时,仿佛这些方法是在本地执行的一样。这种特性使得分布式系统的设计更加简单且...
3. **接口调用机制**:从文件名"CallEJBInterfaceInvocationHandler.java"来看,这可能是一个实现了Java动态代理的类,用于在调用EJB接口时包装超时逻辑。动态代理允许在调用实际接口方法前和后添加额外的行为,比如...
- **调用EJB方法**:最后,通过EJB的接口调用其业务方法。 源码例子可能还包含了错误处理,如处理`NamingException`和`RemoteException`,这些都是在进行JNDI查找和调用EJB时可能出现的异常。 总结来说,EJB中的...
- **远程方法调用(Remote Method Invocation, RMI)**:客户端通过RMI调用EJB的接口,实现跨JVM的通信。适用于客户端不在同一个应用服务器上的情况。 - **本地方法调用(Local Method Invocation)**:当客户端和...
- **远程方法调用 (Remote Method Invocation, RMI)**:客户端通过接口调用EJB的方法,该接口由EJB容器生成并暴露,实现跨JVM通信。 - **本地方法调用 (Local Method Invocation)**:当EJB和客户端在同一JVM中运行...
"ejb_01_client"则可能是客户端代码,它连接到JBoss服务器,查找并调用EJB提供的服务。 EJB的设计模式强调了组件化和解耦,使得开发者可以专注于业务逻辑,而将基础设施如事务管理、安全性、并发控制等交给容器处理...
调用真正的业务方法( EJB的Bean 相当于委托类,可以不实现业务接口, 但是方法必须有,为了保险,最好实现) --- 调用中间件服务完成业务; 业务接口的作用, 生成Stub 和 拦截器; 7, EJB3.0的简化: 比 EJB2.0 : ...
- **远程方法调用(Remote Method Invocation, RMI)**:客户端通过RMI调用EJB的接口,EJB容器负责透明地处理网络通信和对象序列化。 - **本地接口调用(Local Interface)**:当客户端和EJB在同一个JVM中运行时,...
"ejb-project1-client"可能是客户端模块,包含了远程接口的引用和调用EJB服务所需的配置。在Java EE环境中,客户端可以通过JNDI(Java Naming and Directory Interface)查找并调用远程的EJB服务。 "ejb-project1-...
- **Remote Interface**(仅限会话Bean):客户端调用EJB实例的方法的接口。 - **Local Interface**:仅限于同一JVM内调用,没有远程通信开销。 ### 5. EJB的生命周期 EJB组件有其特定的生命周期,包括创建、初始...
客户端调用EJB通常有两种方式:远程接口调用(Remote Interface Invocation)和本地接口调用(Local Interface Invocation)。远程接口适用于跨网络的客户端,而本地接口适用于在同一应用或模块内的通信。对于远程...
首先,你需要将`HelloWorldEJB`部署到服务器,然后配置`HelloWorldEJBClient`以连接到服务器并调用EJB服务。这通常涉及设置正确的服务器连接信息,如JNDI名称。 总之,这个ejb例子程序展示了如何结合使用EJB和JPA来...