我有一个企业应用程序,它有一个 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 中我有一个暴露为 Remote
和 Local
的类。
@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/