`
johnnyhg
  • 浏览: 348204 次
  • 来自: NA
社区版块
存档分类
最新评论

调用EJB远端接口

阅读更多

今天写了一个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 接口放置在应用的类路径下。

分享到:
评论
3 楼 qwfys200 2010-05-06  
我的电子邮箱是:qwfys200@163.com,QQ:617823063,希望您能抽出宝贵的时间帮我看一下,将不胜感激。
2 楼 qwfys200 2010-05-06  
您好,我们最近在做一个小测试,就是用tomcat6上的jsp访问jboss5.0GA下的ejb,总是测试失败,今天看到你这篇文章,所以想向你请教一下。

jsp文件内容如下:
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="net.yunling.ejb.HelloRemote" %>
<%@ page import="javax.naming.*" %>
<%@ page import="java.util.*" %>

<%
HelloRemote remote = null;

try {
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url",
"jnp://localhost:1099");
props.setProperty("java.naming.factory.url.pkgs",
"org.jboss.naming:org.jnp.interfaces");

InitialContext ctx = new InitialContext(props);
remote = (HelloRemote) ctx.lookup("Hello/remote");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(remote.sayHello());
out.println(remote.sayHello());
%>

HelloRemote.java文件内容如下:
package net.yunling.ejb;
import javax.ejb.Remote;

@Remote
public interface HelloRemote {
public String sayHello();
}

Hello.java文件内容如下:
package net.yunling.ejb;
import javax.ejb.Stateless;

@Stateless
public class Hello implements HelloRemote {
@Override
public String sayHello()
{
return "zhongguoren";
}
}
IDE用的是Eclipse3.4,jdk1.6.0.16,而且我已经将jboss5.0GA-Home/client/下的所有*.jar文件复制到了当前工程的WebContent/WEB-INF/lib之下。启动tomcat后,将web工程发布到tomcat下出现了如下异常

java.lang.ClassCastException: javax.naming.Reference cannot be cast to net.yunling.ejb.HelloRemote
at org.apache.jsp.index_jsp._jspService(index_jsp.java:80)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
2010-5-6 14:06:39 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.index_jsp._jspService(index_jsp.java:84)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
2010-5-6 14:48:14 org.apache.catalina.core.StandardContext reload


1 楼 绝对可能 2008-09-26  
看帖留名!

相关推荐

    EJB分布式远程调用的小例子的简单实现

    首先,我们需要创建一个EJB接口,这个接口定义了可供远程调用的方法。例如: ```java import javax.ejb.Remote; @Remote public interface MyRemoteService { String doSomething(String input); } ``` 然后,...

    EJB调用原理分析

    3. **调用业务方法**: 客户端通过Remote接口调用EJB的业务方法。对于Entity Bean,客户端通常通过查找来获取现有对象,而不是创建。 4. **容器管理**: EJB容器在调用实际的bean实例前,会进行一系列容器管理操作,如...

    CORBA Client/Server调用EJB开发说明,带有例子学习

    总结来说,这个教程提供了使用C++通过CORBA调用EJB的详细步骤,包括生成IDL文件、创建C++ Stub、初始化ORB、解析和调用EJB方法。理解这个过程对于开发者来说是至关重要的,因为它涉及到多个中间件技术的集成,包括...

    三种方式实现java远程调用(rmi),绝对可用

    1. **创建JNDI上下文**:在服务器端,使用`InitialContext`创建JNDI上下文并绑定远程对象。 2. **查找远程对象**:在客户端,同样通过`InitialContext`查找JNDI树中的远程对象。 3. **调用远程方法**:找到远程对象...

    EJB_ejb_plannedvhz_

    - 一旦有了EJB的远程引用,客户端就可以像调用本地方法一样调用EJB的方法,实际上,这一切都在后台由容器处理,包括序列化参数,通过网络发送,反序列化并执行方法,最后将结果返回给客户端。 4. **案例分析**: ...

    C++通过CORBA访问EJB

    本资源详细介绍了如何利用C++作为客户端,通过CORBA(Common Object Request Broker Architecture)中间件来调用EJB组件,实现远程方法调用。 首先,我们要理解C++和EJB。C++是一种静态类型的、编译式的、通用的、...

    EJB超时调用

    3. **接口调用机制**:从文件名"CallEJBInterfaceInvocationHandler.java"来看,这可能是一个实现了Java动态代理的类,用于在调用EJB接口时包装超时逻辑。动态代理允许在调用实际接口方法前和后添加额外的行为,比如...

    EJB中JNDI的使用源码例子

    - **调用EJB方法**:最后,通过EJB的接口调用其业务方法。 源码例子可能还包含了错误处理,如处理`NamingException`和`RemoteException`,这些都是在进行JNDI查找和调用EJB时可能出现的异常。 总结来说,EJB中的...

    各种EJB之间的调用示例.zip

    - **远程方法调用(Remote Method Invocation, RMI)**:客户端通过RMI调用EJB的接口,实现跨JVM的通信。适用于客户端不在同一个应用服务器上的情况。 - **本地方法调用(Local Method Invocation)**:当客户端和...

    各种EJB之间的调用示例.7z

    - **远程方法调用 (Remote Method Invocation, RMI)**:客户端通过接口调用EJB的方法,该接口由EJB容器生成并暴露,实现跨JVM通信。 - **本地方法调用 (Local Method Invocation)**:当EJB和客户端在同一JVM中运行...

    ejb代码实例

    "ejb_01_client"则可能是客户端代码,它连接到JBoss服务器,查找并调用EJB提供的服务。 EJB的设计模式强调了组件化和解耦,使得开发者可以专注于业务逻辑,而将基础设施如事务管理、安全性、并发控制等交给容器处理...

    ejb3.0培训教程与源码(绝对精品)

    调用真正的业务方法( EJB的Bean 相当于委托类,可以不实现业务接口, 但是方法必须有,为了保险,最好实现) --- 调用中间件服务完成业务; 业务接口的作用, 生成Stub 和 拦截器; 7, EJB3.0的简化: 比 EJB2.0 : ...

    基于Java的各种EJB之间的调用示例.zip

    - **远程方法调用(Remote Method Invocation, RMI)**:客户端通过RMI调用EJB的接口,EJB容器负责透明地处理网络通信和对象序列化。 - **本地接口调用(Local Interface)**:当客户端和EJB在同一个JVM中运行时,...

    eclipse-ejb项目.zip

    "ejb-project1-client"可能是客户端模块,包含了远程接口的引用和调用EJB服务所需的配置。在Java EE环境中,客户端可以通过JNDI(Java Naming and Directory Interface)查找并调用远程的EJB服务。 "ejb-project1-...

    EJB入门教程,整体介绍EJB

    - **Remote Interface**(仅限会话Bean):客户端调用EJB实例的方法的接口。 - **Local Interface**:仅限于同一JVM内调用,没有远程通信开销。 ### 5. EJB的生命周期 EJB组件有其特定的生命周期,包括创建、初始...

    Weblogic 创建一个简单的EJB项目

    客户端调用EJB通常有两种方式:远程接口调用(Remote Interface Invocation)和本地接口调用(Local Interface Invocation)。远程接口适用于跨网络的客户端,而本地接口适用于在同一应用或模块内的通信。对于远程...

    ejb例子程序

    首先,你需要将`HelloWorldEJB`部署到服务器,然后配置`HelloWorldEJBClient`以连接到服务器并调用EJB服务。这通常涉及设置正确的服务器连接信息,如JNDI名称。 总之,这个ejb例子程序展示了如何结合使用EJB和JPA来...

Global site tag (gtag.js) - Google Analytics