我知道Local接口是为同一容器的JVM实例中的客户端设计的,远程接口是为驻留在EJB容器JVM外部的客户端设计的。如果Web应用程序客户端不在同一个.ear中驻留(或打包)但位于同一Java EE服务器上,那该怎么办?
答案 0 :(得分:26)
正式@Local
带注释的bean只有在同一个应用程序中才能访问。与.ear(或其他.war或其他.jar EJB)分开部署的.war是一个不同的应用程序,即使部署到同一个应用程序服务器实例也是如此。
因此没有保证你的.war中的代码可以调用.ear中定义的@Local
EJB bean。
然而,在几乎所有应用程序服务器的实践中,这都可行。
请求EJB 3.2规范正式支持本地跨应用程序调用:http://java.net/jira/browse/EJB_SPEC-22
答案 1 :(得分:5)
本地接口将用于同一应用程序中的通信。它并不一定意味着 JVM 。
重点是:即使在同一个JVM实例中,在同一台服务器上,两个不同的应用程序也不能使用本地接口进行通信(这意味着本地和无接口视图)。
如果您有一个Web组件(WAR)以及位于同一应用程序中的业务组件(EJB-JAR),最直观,最直接的解决方案是将它们打包在一个EAR或一个WAR中(因为Java) EE 6)。
答案 2 :(得分:0)
您使用远程接口,但是使用JNDI进行查找(这就是我的工作方式),这样您就可以在服务器中找到EJB的实例,并可以在Web应用程序中使用它。
虽然您仍然需要在Web应用程序项目中使用带有EJB接口的jar。
编辑,我同意JB Nizet,你为什么要在EAR之外使用WAR?
答案 3 :(得分:0)
可以跨应用程序,应用程序服务器内部以及外部甚至其他主机调用远程接口。
因此假设您需要远程(@Remote
)接口。在EJB 3.1中,您可以使用依赖注入。