繁体   English   中英

JavaEE 7:无接口的EJB jndi-name

[英]JavaEE 7: EJB jndi-name without interface

我使用GF4服务器,并且在其日志中有:

EJB com.test.cms.svr.web.Service2的可移植JNDI名称:[java:global / com.test.cms.svr.web_1.0.0 / com.test.cms.svr.web.Service2,java:global / com.test.cms.svr.web_1.0.0 / com.test.cms.svr.web.Service2!com.test.fw.svr.web.bundle.ComponentService]]]

我的问题:

  1. 为什么会有两个jndi名称-带接口和不带接口?
  2. 为什么即使EJB仅是本地的,我也只能使用带接口的jndi-name来获得bean?

为什么会有两个jndi名称-带接口和不带接口?

这是EJB 3.1功能,称为可移植JNDI名称。 这是此博客的很好的解释:

客户端应用程序需要使用全局JNDI名称来查找EJB。 一直以来,ejb规范都对这种全球性jndi名称的可移植性保持沉默。 这允许每个供应商以特定于供应商的方式为EJB分配全局jndi名称。 这意味着使用全局JNDI名称执行查找的客户端代码本质上不可跨应用程序服务器供应商实现移植。

EJB 3.1通过强制每个容器必须为EJB分配(至少一个)定义良好的全局JNDI名称来解决上述问题。 EJB的(便携式)全局JNDI名称的一般语法具有以下形式:

java:global/[<application-name>]/<module-name>/<bean-name>!<fully-qualified-bean-interface-name>

除了上面的名称之外,如果EJB仅公开一个客户端视图(即,它仅实现一个接口或无接口视图),则还要求容器将Bean映射到

java:global/[<application-name>]/<module-name>/<bean-name>

哪里

  1. <application-name>默认为没有扩展名的捆绑包名称(.ear文件名)。 可以在application.xml中覆盖它。 同样,仅当Bean打包在.ear文件中时才适用。
  2. <module-name>默认为不带扩展名的捆绑包名称(.war或.jar)。 同样,可以在ejb-jar.xml中覆盖它。
  3. <bean-name>默认为<bean-name>的非限定类名。 但是,如果@Stateful@Stateless@Singleton使用name属性,则在那里指定的值将用作bean名称。

GlassFish EJB FAQ中还有一些特定于GlassFish的信息。

为什么即使EJB仅是本地的,我也只能使用带接口的jndi-name来获得bean?

我猜您的意思是从同一JVM内同一Web应用程序中的另一个EJB或模块中查找。 否则,如果没有@Remote接口,这将是不可能的。 以下是GlassFish EJB常见问题中的两个声明:

我有一个带有本地接口的EJB组件。 我可以从Application Client或独立的Java客户端访问它吗?

如果EJB组件在服务器中运行,则为否。 EJB Local视图是使用按引用调用语义的优化调用路径。 它仅适用于与目标EJB组件属于同一应用程序的Web组件和EJB组件。
要从Application Client或独立的Java客户端访问服务器中运行的EJB组件,您将需要使用Remote 3.x Business界面,2.x Home界面或Web服务。

如果使用GlassFish v3,一种替代方法是使用EJB 3.1 Embeddable API。 这允许Java SE程序直接在同一JVM中执行EJB组件,而无需使用服务器进程。

我有一个带有本地接口的EJB组件。 是否可以从其他应用程序中的Web组件访问它?

否。EJB规范仅需要从同一JVM中的同一应用程序内部访问EJB组件的本地EJB接口。 一种选择是将ejb-jar与.war打包在同一.ear中。 如果使用GlassFish v3,则第二个选择是将EJB组件直接打包在.war中。

GlassFish EJB FAQ还包含有关此主题的更多详细信息。

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM