`
johnnyhg
  • 浏览: 342494 次
  • 来自: 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  
看帖留名!

相关推荐

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

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

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    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...

    java 面试题 总结

    SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。 对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上...

    超级有影响力霸气的Java面试题大全文档

    SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。  对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器...

    深入Java Servlet网络编程

    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+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    现在,Flex 如何才能通过 BlazeDS 调用 FlexService 接口呢?由于 FlexService 对象已经被 Spring 管理,因此,我们需要编写一个 FlexFactory 告诉 BlazeDS 如何找到 Spring 管理的 FlexService 的实例。flexFactory...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    现在,Flex 如何才能通过 BlazeDS 调用 FlexService 接口呢?由于 FlexService 对象已经被 Spring 管理,因此,我们需要编写一个 FlexFactory 告诉 BlazeDS 如何找到 Spring 管理的 FlexService 的实例。flexFactory...

    JAVA上百实例源码以及开源项目源代码

    得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI...

    Java相关技术(详细资料)

    这样,远程方法激活可以发生在对等的两端,也可以发生在客户端和服务器之间,只要双方的应用程序都是用Java写的。  4、Java IDL(Java Interface Definition Language) 提供与CORBA(Common Object Request Broker ...

    JAVA上百实例源码以及开源项目

    得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI...

    《JSP简明教程》课件

    服务器端构件可以根据应用需求迅速地加以修改,且构件在网络中的位置和应用无关,因此系统管理员可以很容易地重新配置系统的负载。 Java Servlet Servlet是使用Java Servlet应用程序设计接口(API)及相关类和方法...

    Spring中文帮助文档

    5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP...

    Spring API

    5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP...

    Spring 2.0 开发参考手册

    目录 前言 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接口定义管理接口 ...

    Spring.net框架

    MainApp.exe负责完成对象的创建、组装以及调用工作: using System; namespace IocInCSharp { public class MainApp { public static void Main() { SayHello sayHello = new SayHello(); sayHello....

    二十三种设计模式【PDF版】

    不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of Responsibility(责任链) 各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个. 设计模式之 Mediator(中介) Mediator ...

    spring chm文档

    5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP...

    Spring-Reference_zh_CN(Spring中文参考手册)

    5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 5.4.2.1. 注册用户自定义的PropertyEditor ...

Global site tag (gtag.js) - Google Analytics