在没有 EAR 的客户端中创建 EJB 远程引用
Creating EJB remote references into a client witout EAR
嗯,这是我的开发环境:
我正在使用 Java 1.8 和 Eclipse 4.5.1 (Mars),安装了 J2EE 工具和插件以与作为应用程序服务器的 WildFly 8 一起工作
我创建了一个 Java EJB 项目,其中包含一个简单的 HelloWorld 无状态会话 bean class。它实现了 2 个接口:@Remote and/or @Local,我在其中定义了一个 String getHelloWorld() stub.
现在,我有了使用 EJB 的客户端:一个带有一个 Servlet 的动态 Web 项目。
在 servlet 中,我可以使用注释注入 ejb class,如下所示:
@EJB
私有 HelloWorldLocal bean;
要么
@EJB
私有 HelloWorldRemote bean;
如您所见,我将 bean 声明为 HelloWorldLocal/HelloWorldRemote 类型。但是,如果我想部署 运行 我的应用程序,
我需要先将 EJB 和 Web 项目放入 EAR 中。这允许 Servlet 知道并编译 HelloWorldLocal 或 HelloWorldRemote bean 类型,只需将 EJB 项目添加到
构建路径作为项目,甚至将 EJB 项目作为部署程序集指令。
我想在 EAR 之外创建一个客户端(远程 Swing 应用程序或远程网站)。这意味着我的客户会
没有机会像我对 EAR 那样将 EJB 项目接口添加为构建路径中的项目引用。就算想打电话
带有 JNDI 的远程 bean,我需要将 lookup() 对象转换为那些类型才能使用 bean 方法。
问题是:
如果这些接口被声明到一个单独的 EJB 项目中,我如何才能从没有 EAR 的远程客户端获取 HelloWorldRemote/HelloWorldLocal bean 类型?
(当然,我这里不想用EJB工程创建.jar)
我不确定我是否完全理解您的要求,而且我已经很多年没有这样做了,但是通常的方法是创建一个 EJB 客户端 JAR 仅包含客户端的 bean 依赖项和远程接口。为了最好地实现这一点,您需要使用 Maven 等工具来构建您的项目,该项目在 EJB 客户端设置上包含 EJB plugin for this. If you're not using Maven, you're going to be limited by the tooling within Eclipse, though at one point it did contain EJB client generation support. The Wildfly documentation 可能也有帮助,但明确提到打包客户端超出范围。
我想分享我找到的唯一一个解决方案:我必须创建一个包含所有 EJB 接口(@Remote、@Local 等)的 .jar 文件,然后像引用一样使用它在我的远程客户端上输入类型。
这个 .jar 将在任何 EAR 之外。但是,由于 @ 注释,它需要 jboss-client.jar。因此,我将所有接口和 jboss-client.jar 打包,将它们导出到 .jar,并将这个新文件作为外部 jar 添加到我的 EJB 和客户端项目中!现在我可以在 EJB 类 实现和@EJB 客户端变量上使用 HelloWorld* 类型。
如果我想要一个远程 Web 客户端,我已经将带有 Web 项目模块的 EJB 项目放入 EAR 中 - 我们绝对需要 EAR。 Web 模块有 Servlet,Servlet 处理 @EJB 变量和响应。所以,在这个 EAR 之外,我只需要对 servlet 使用 URL,你明白了:EJB 方法结果是从远程 Web 客户端获得的。
在使用JNDI 的桌面应用程序中,我只是将接口.jar 像外部jar 一样放到客户端项目中。这样,我可以将 .lookup() 转换为 HelloWorld* 类型并使用其方法。
- 希望对您有所帮助。
那么便携式 JNDI 查找呢? https://docs.oracle.com/cd/E19798-01/821-1841/girgn/index.html 如果 EJB 与您的客户端在同一个 JVM 中,它应该可以工作。
嗯,这是我的开发环境:
我正在使用 Java 1.8 和 Eclipse 4.5.1 (Mars),安装了 J2EE 工具和插件以与作为应用程序服务器的 WildFly 8 一起工作
我创建了一个 Java EJB 项目,其中包含一个简单的 HelloWorld 无状态会话 bean class。它实现了 2 个接口:@Remote and/or @Local,我在其中定义了一个 String getHelloWorld() stub.
现在,我有了使用 EJB 的客户端:一个带有一个 Servlet 的动态 Web 项目。 在 servlet 中,我可以使用注释注入 ejb class,如下所示:
@EJB 私有 HelloWorldLocal bean; 要么 @EJB 私有 HelloWorldRemote bean;
如您所见,我将 bean 声明为 HelloWorldLocal/HelloWorldRemote 类型。但是,如果我想部署 运行 我的应用程序, 我需要先将 EJB 和 Web 项目放入 EAR 中。这允许 Servlet 知道并编译 HelloWorldLocal 或 HelloWorldRemote bean 类型,只需将 EJB 项目添加到 构建路径作为项目,甚至将 EJB 项目作为部署程序集指令。
我想在 EAR 之外创建一个客户端(远程 Swing 应用程序或远程网站)。这意味着我的客户会 没有机会像我对 EAR 那样将 EJB 项目接口添加为构建路径中的项目引用。就算想打电话 带有 JNDI 的远程 bean,我需要将 lookup() 对象转换为那些类型才能使用 bean 方法。
问题是:
如果这些接口被声明到一个单独的 EJB 项目中,我如何才能从没有 EAR 的远程客户端获取 HelloWorldRemote/HelloWorldLocal bean 类型? (当然,我这里不想用EJB工程创建.jar)
我不确定我是否完全理解您的要求,而且我已经很多年没有这样做了,但是通常的方法是创建一个 EJB 客户端 JAR 仅包含客户端的 bean 依赖项和远程接口。为了最好地实现这一点,您需要使用 Maven 等工具来构建您的项目,该项目在 EJB 客户端设置上包含 EJB plugin for this. If you're not using Maven, you're going to be limited by the tooling within Eclipse, though at one point it did contain EJB client generation support. The Wildfly documentation 可能也有帮助,但明确提到打包客户端超出范围。
我想分享我找到的唯一一个解决方案:我必须创建一个包含所有 EJB 接口(@Remote、@Local 等)的 .jar 文件,然后像引用一样使用它在我的远程客户端上输入类型。
这个 .jar 将在任何 EAR 之外。但是,由于 @ 注释,它需要 jboss-client.jar。因此,我将所有接口和 jboss-client.jar 打包,将它们导出到 .jar,并将这个新文件作为外部 jar 添加到我的 EJB 和客户端项目中!现在我可以在 EJB 类 实现和@EJB 客户端变量上使用 HelloWorld* 类型。
如果我想要一个远程 Web 客户端,我已经将带有 Web 项目模块的 EJB 项目放入 EAR 中 - 我们绝对需要 EAR。 Web 模块有 Servlet,Servlet 处理 @EJB 变量和响应。所以,在这个 EAR 之外,我只需要对 servlet 使用 URL,你明白了:EJB 方法结果是从远程 Web 客户端获得的。
在使用JNDI 的桌面应用程序中,我只是将接口.jar 像外部jar 一样放到客户端项目中。这样,我可以将 .lookup() 转换为 HelloWorld* 类型并使用其方法。
- 希望对您有所帮助。
那么便携式 JNDI 查找呢? https://docs.oracle.com/cd/E19798-01/821-1841/girgn/index.html 如果 EJB 与您的客户端在同一个 JVM 中,它应该可以工作。