当从另一个EJB3模块调用远程JNDI (Glassfish)时,通常会有可用的接口,它们被包含在JAR文件中,这样当您执行JNDI查找时,一切都会按预期工作。
我遇到过这样一种情况: JNDI名称是在运行时确定的,我尝试以通常的方式访问从EJB3检索到的EJB3失败了,容器报告远程接口类的ClassNotFound。这对我来说很奇怪,因为所有接口类都扩展了一个父接口,而我在调用EJB模块时确实对该接口有依赖关系,即:
IParent ejbRef = (IParent) JndiLocator.getObject("jndinameRemote");
在我的JAR中不需要确切的远程EJB3接口字节码的情况下,这可以实现吗?
家伙
发布于 2018-03-24 20:06:08
即使我完全不确定上面的设置是什么,我也同样需要在编译时不知道客户端jars的情况下尝试调用EJB,事实上,我也无法知道EJB部署在什么应用程序服务上。
我已经设法通过编写定制的类加载器来做到这一点,这里的问题是,反过来试图调用EJB的类必须自己使用定制的类加载器加载,以及所有必要的jar,即具有接口和模型的客户端jar以及特定于应用服务器的客户端jar。我将所有上下文属性作为输入传递给我的调用程序类,以初始化上下文工厂并调用bean。
这些是实现这一目标的高级步骤
使用方法invokeEJB创建类Ejb,您可以向它传递一对带有属性的映射,用于准备上下文和EJBInvoker接口、方法、参数类、值和输出类。使用反射来创建InitialContextFactory的实例以及Bean对象、参数和方法调用。将上述类添加到单独的jar文件中,并使用自定义的类加载器从外部项目调用具有所需属性的方法。
https://stackoverflow.com/questions/1996211
复制相似问题