在EAR中创建EJB远程引用到客户端

时间:2016-02-27 16:41:55

标签: java eclipse java-ee ejb-3.1

嗯,这是我的开发环境:

  • 我正在使用Java 1.8和Eclipse 4.5.1(Mars),安装的J2EE工具和插件与WildFly 8一起使用作为Application Server

  • 我创建了一个Java EJB项目,其中包含一个简单的HelloWorld无状态会话bean类。它实现了2个接口:@Remote和/或@Local,我在其中定义了一个String getHelloWorld()存根。

  • 现在,我的客户端使用了EJB:一个带有一个Servlet的动态Web项目。 在servlet中,我可以使用注释注入ejb类,如下所示:

@EJB 私有HelloWorldLocal bean; 要么 @EJB 私有HelloWorldRemote bean;

如您所见,我将bean声明为HelloWorldLocal / HelloWorldRemote类型。但是,如果我想部署并运行我的应用程序, 我需要首先将EJB和Web项目放入EAR中。这允许Servlet通过简单地添加EJB项目来了解和编译HelloWorldLocal或HelloWorldRemote bean类型 Build Path as Project,或者甚至将EJB项目作为Deployment Assembly指令。

我想在EAR之外创建一个客户端(远程Swing应用程序或远程WebSite)。这意味着我的客户会 没有机会像我在EAR中那样在构建路径中添加EJB项目接口作为项目引用。即使我想打电话 使用JNDI的远程bean,我需要将lookup()对象强制转换为这些类型才能使用bean方法。

问题是:

如果将这些接口声明为单独的EJB项目,如何从没有EAR的远程客户端获取HelloWorldRemote / HelloWorldLocal bean类型? (当然,我不想在这里使用EJB项目创建.jar。)

3 个答案:

答案 0 :(得分:2)

那么便携式JNDI查找呢? https://docs.oracle.com/cd/E19798-01/821-1841/girgn/index.html如果EJB与客户端在同一个JVM中,它应该可以工作。

答案 1 :(得分:1)

我不确定我完全理解你在问什么,而且我多年没有这样做了,但通常的方法是创建一个仅包含 EJB客户端JAR 客户端的bean依赖项和远程接口。为了最好地实现这一点,您需要使用Maven等工具来构建包含https://play.golang.org/p/XctFgKZI-K的项目。如果您不使用Maven,那么您将受到Eclipse中工具的限制,尽管它确实包含EJB plugin for this支持。 EJB客户端设置上的EJB client generation也可能有所帮助,但明确提到打包客户端超出了范围。

答案 2 :(得分:0)

我想分享我找到的唯一一个解决方案:我必须创建一个.jar文件,包含所有EJB接口(@ Remote,@ Local等),并像引用一样使用它我的远程客户端上的类型。

这个.jar将在任何EAR之外。但是,由于@ annotations,它需要jboss-client.jar。所以,我打包了所有,接口和jboss-client.jar,将它们导出到.jar,我在我的EJB和客户端项目中添加了这个新文件作为外部jar!现在我能够在EJB类实现和@EJB客户端变量上使用HelloWorld *类型。

如果我想要一个远程Web客户端,我已经将带有Web项目模块的EJB项目放入EAR中 - 我们肯定需要一个EAR。 Web模块具有Servlet,servlet处理@EJB变量和响应。所以,在这个EAR之外,我只需要对servlet使用URL,你就可以了:从远程Web客户端获得EJB方法结果。

在使用JNDI的桌面应用程序中,我只是将类似外部jar的接口.jar放入客户端项目中。通过这种方式,我可以将.lookup()转换为HelloWorld *类型并使用其方法。

  • 我希望它有所帮助。