我知道,本地接口是为同一容器的JVM实例中的客户端设计的,而远程接口是为驻留在EJB容器的JVM之外的客户端设计的。不是驻留(或打包)在同一.ear中但驻留在同一Java EE服务器上的Web应用程序客户端如何?
[[0]官方注释的Bean,只有在相同的应用程序中才可以访问。与.ear(或其他.war或其他.jar EJB)分开部署的.war是不同的应用程序,即使部署到同一应用程序服务器实例。
因此,没有guarantee您的.war中的代码可以调用.ear中定义的@Local
EJB bean。
但是,实际上在几乎所有应用程序服务器中,它都可以正常工作。
[要求EJB 3.2规范正式支持本地跨应用程序调用:@Local
本地接口将用于同一application中的通信。它不一定表示JVM。
重点是:即使在同一JVM实例中,在同一服务器上,两个不同的应用程序不能使用本地接口(这意味着本地和无接口视图)进行通信。
[如果在同一应用程序中同时具有Web组件(WAR)和业务组件(EJB-JAR),则最直观,最直接的解决方案是将它们打包在一个EAR或一个WAR中(因为Java EE 6)。
您使用远程接口,但是您使用JNDI进行查找(这就是我的方式),这样您就可以在服务器中找到EJB实例并可以在Web应用程序中使用它。
尽管您仍需要在Web应用程序项目中使用带有EJB接口的jar。
编辑,我同意JB Nizet,为什么要在EAR之外进行战争?
可以从应用程序服务器内部的任何位置以及外部,甚至从其他主机在应用程序之间调用远程接口。
因此,假设您需要远程(https://download.oracle.com/otndocs/jcp/ejb-3_2-fr-spec)接口。在EJB 3.1中,可以使用依赖项注入。