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

时间:2014-01-03 12:52:56

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

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

这部署在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");

这很好用。

第一期 : -

我们在WAS的同一JVM上部署了另一个EAR应用程序。从这个应用程序,我们试图访问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

的类强制转换异常

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

更新 的 我在coderanch中得到了post的详细回复。与第一个答案相似

1 个答案:

答案 0 :(得分:1)

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

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