这很令人困惑,当我在 Netbeans 中创建一个新的Session Bean时,它可以选择local interface
和remote
。但是,如果我选择remote
,则会出现一个列表,其中包含现有的Java SE 和 ME 项目。如果我选择其中任何一个(顺便说一句,我打算以后用作bean的GUI客户端)。它在我的企业应用程序中生成会话bean,但它在 Java SE
项目中添加了远程类。我不明白这是什么意思?
答案 0 :(得分:2)
如果您创建无状态EJB sesion bean,它可以实现本地和/或远程接口。
在您的情况下,我建议使用远程界面,因为您的一个客户端将是远程的:命令行独立应用程序通常不会在应用程序服务器主机(与通常驻留在同一JVM中的servlet相反)。
尝试以一个用户交互导致一次调用EJB层的方式设计远程接口。如果您的独立应用程序运行得足够快,那么servlet也可能足够快。如果你反过来这样做,你可能会发现适用于servlet的界面设计不适合进行远程访问。
本地与远程接口之间存在一些语义和技术差异:使用第一个意味着该接口只能用于localhost(这么多电话不会影响性能)。本地bean只存在于一个JVM中。它会影响有关按值/引用调用的行为(请参阅Why do we need separate Remote and Local interfaces for EJB 3.0 session beans)。
关于NetBeans屏幕截图:
(远程)客户端在其范围内具有远程接口。没关系,因为它不需要看到任何其他内容。
在服务器/ EJB端上,还有其他一切:EJB和本地接口。唯一似乎缺少的是远程interace,因为EJB也实现了它。它背后可能存在一些NetBeans IDE魔法,但服务器端也需要远程接口。
答案 1 :(得分:1)
EJB旨在成为“执行业务逻辑”的组件。它们可以在本地使用(由app服务器本身的其他组件调用),也可以由客户端(例如applet,桌面应用程序)远程使用。
在后一种情况下,您通过远程接口访问EJB(这有意义它应该包含在客户端中,不是吗?)加上一些配置告诉客户端如何连接到实际的服务器执行那些bean。
答案 2 :(得分:0)
这就是问题所在,我一直在努力解决这个问题:从实体类创建EJB时,NetBeans使您能够创建远程接口。这是我正在做的事情,因为我将有许多独立的客户访问这些ejb。当您告诉NetBeans要创建远程接口时,它会强制您将它们放在另一个项目中。这一切都很好,直到你定义你的实现,看起来像这样:
public class DataFacade extends AbstractFacade<MyEntityClass> implements DataFacadeRemote {
...
}
现在,当您尝试将您的ejb jar部署到Glassfish时,它声称您的jar中没有ejb,这是正确的,因为它对DataFacadeRemote接口一无所知。我为解决这个循环问题所做的是创建一个库jar,我手动将其复制到glassfish服务器。然后当我部署ejb jar时,它很高兴地找到了库jar并理解了facade类(ejbs)。这也是一个巨大的痛苦,因为每次更改接口或实体类时都需要复制库jar,这可能需要重新启动应用程序服务器来重新加载库,因为它并没有这样做。似乎是自动发生的。
如果我的行为不正确,我也会欣赏正确的方向。