当从另一个EJB模块调用远程EJB3(Glassfish)时,通常有可用的接口,它们作为JAR文件包含在内,这样当你进行JNDI查找时,一切都按预期工作。
我有一种情况,其中EJB3 JNDI名称是在运行时确定的,并且我尝试以通常的方式访问从JNDI检索的EJB失败,容器抱怨ClassNotFound用于远程接口类。这对我来说很奇怪,因为所有接口类扩展了一个父接口,我在其调用EJB模块中具有依赖性,即:
IParent ejbRef =(IParent)JndiLocator.getObject(“jndinameRemote”);
这是否可以使用EJB3,而不需要在我的JAR中提供精确的远程EJB接口字节码?
博若
答案 0 :(得分:0)
即使我完全不确定上面的设置是什么,但是当编译时不知道客户端jar时我有类似的尝试调用EJB的需要,事实上除此之外我也没办法知道什么应用程序服务是部署的EJB。
我设法通过编写自定义类加载器来实现这一点,这里的问题是,反过来尝试调用EJB的类必须使用Customized类加载器以及所有必需的jar(即客户端jar)自身加载接口和模型以及应用程序服务器特定的客户端jar。 我将所有上下文属性作为输入传递给我的Invoker类,以初始化上下文工厂并调用bean。
这些是实现此目标的高级步骤
使用方法invokeEJB创建类EJBInvoker,您可以传递几个带有属性的Maps来准备上下文和Ejb接口,方法,参数类,值和输出类。 使用反射创建InitialContextFactory实例以及Bean对象,参数和方法调用。 将上面的类添加到单独的jar文件中,并使用自定义的类加载器调用具有外部项目所需属性的方法。