websphere - 部署 EJB 并使用远程和本地引用访问它

标签 websphere ejb-3.0 websphere-7 java-ee-5

我有一个企业应用程序,它有一个 Stateless EJB 和一个基于 JAX-WS 的 Web 服务。 Web 服务在被调用时将在内部调用 EJB。 lib 文件夹包含 EJB 和 WAR 所需的公共(public)库。 在以不同方式访问 EJB 时,我遇到了两个问题。当我通过网络服务访问它时它工作正常

这是部署在 IBM WAS v7 上的 EAR 的结构

MyProject.EAR
    webservice.war
    ejb.jar
    lib
        abc.jar
        xyz.jar

现在在 EJB 中我有一个暴露为 RemoteLocal 的类。

@Stateless
public class MyAccountBean implements AccountLocal,AccountRemote{

}

如上所述,在 Web 项目中,我们使用本地引用调用 EJB。

AccountLocal accLocal=(AccountLocal)ctx.lookup("ejblocal:com.my.test.account.AccountLocal");

这很好用。

第一期:-

我们有另一个 EAR 应用程序部署在与 WAS 相同的 JVM 上。从这个应用程序,我们试图访问 MyProject.EAR 中可用的 EJB。是否可以使用 JNDI 查找获取此信息,因为它们都在同一个 JVM 上?我们尝试了以下代码,

AccountLocal accLocal=(AccountLocal)ctx.lookup("jndiOfAccountLocal");

但它给出了类转换异常。

Error 500: java.lang.ClassCastException: com.my.test.account.EJSLocal0SLDAccount_e303bda3 incompatible with com.my.test.account.AccountLocal

第二期:-

我们遇到的第二个问题是远程 EJB 查找。下面是我们用来从部署在不同服务器上的 Web 应用程序获取远程 EJB 引用的代码。

Properties props = new Properties();
props.put( Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory" );
props.put( javax.naming.Context.PROVIDER_URL, "iiop://localhost:2809" );

AccountRemote remote = null;
try{
    InitialContext ctx = new InitialContext( props );

    lobj = ctx.lookup( "dcpejbsvc" );

    AccountRemote remoteObj = (AccountRemote)PortableRemoteObject.narrow( lobj, AccountRemote.class );

    InputVO input = constructInput();

    OutputVO output = remoteObj.getAccountInfo( input );
}
catch( NamingException e ){
    // TODO Auto-generated catch block
    e.printStackTrace();
}

这给出了类转换异常 Error 500: java.lang.ClassCastException: cannot cast class org.omg.stub.java.rmi._Remote_Stub to interface com.my.test.account.AccountRemote

你能指导我解决这些问题吗?

已更新: 我从 post 得到了详细的回复在代码中。类似于第一个答案

最佳答案

对于第一个问题,请参阅 EJB modules 的“本地客户端 View ”部分信息中心的主题。具体来说,同一个本地接口(interface) Class 需要对两个应用程序可见(从 ClassLoader 的角度来看)。这通常是通过使用服务器范围的共享库来完成的。

对于第二个问题,我的猜测是你的“不同的服务器”没有_AccountRemote_Stub。其他服务器是 WebSphere Application Server v7 或更高版本吗?如果不是,您可能需要使用 WAS_HOME/bin/createEJBStubs 命令生成 stub 。否则,请更新您的答案以显示 ClassCastException 的完整堆栈跟踪(WebSphere Application Server v7 或更高版本应自动生成 stub ,完整堆栈跟踪可能会给出提示)。

关于websphere - 部署 EJB 并使用远程和本地引用访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20904130/

相关文章:

java - IBM WAS HTTPS 连接证书链错误

websphere 应用程序服务器 - java.lang.IllegalArgumentException : Property reuse-instanceis not supported

java - Websphere教程需要推荐

jsf-2 - EJB 方法不是从构造函数调用

java - 保持远程 EJB 和 Web 服务的状态

java - 使用 Java 从 WebSphere Application Server 获取 session 超时值

java - 使用 JMS 的 WebSphere MQ

java - Eclipse - EJB 项目 - 提取包含接口(interface)的 Jar

websphere - 启动 Websphere Application Server 时出现 TCP channel 初始化失败错误

java - 将 Websphere 7 配置为对所有请求使用单个 JAX-WS 服务实例