【问题标题】:JavaEE 7: EJB jndi-name without interfaceJavaEE 7:没有接口的 EJB jndi-name
【发布时间】:2014-06-14 15:17:31
【问题描述】:

我使用 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?

【问题讨论】:

    标签: java jakarta-ee glassfish ejb jndi


    【解决方案1】:

    为什么会有两个 jndi 名字——带接口和不带接口?

    这是一个 EJB 3.1 特性,称为可移植 JNDI 名称。这是来自this blog的很好的解释:

    客户端应用程序需要使用全局 JNDI 名称来查找 EJB。全部 沿着 ejb 规范一直对此类的可移植性保持沉默 全局 jndi 名称。这允许每个供应商分配一个全局 jndi 以供应商特定的方式为 EJB 命名。这意味着客户端 使用全局 JNDI 名称执行查找的代码本来就是 不可跨 appserver 供应商实现移植。

    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 文件名)。这可以在 应用程序.xml。此外,仅适用于 bean 被打包在一个 .ear 文件中。
    2. <module-name> 默认为不带捆绑扩展名的捆绑名称(.war 或 .jar)。同样,这可以在 ejb-jar.xml 中被覆盖。
    3. <bean-name> 默认为 bean 的非限定类名。但是,如果 @Stateful@Stateless@Singleton 使用名称 属性,那么那里指定的值将用作 bean 名字。

    the GlassFish EJB FAQ 中有一些额外的 GlassFish 特定信息。

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

    我猜你的意思是从同一个 JVM 内同一个 Web 应用程序中的另一个 EJB 或模块进行查找。否则,如果没有@Remote 接口,这应该是不可能的。以下是 GlassFish EJB 常见问题解答中的两条语句:

    我有一个带有本地接口的 EJB 组件。我可以从应用程序客户端或独立的 java 客户端访问它吗?

    如果 EJB 组件在服务器中运行,则不会。 EJB 本地 view 是使用引用调用的优化调用路径 语义。它仅适用于 Web 组件和 EJB 组件 与目标 EJB 组件属于同一应用程序的一部分。
    访问在服务器中运行的 EJB 组件 应用程序客户端或独立的 java 客户端,您需要使用 Remote 3.x Business 界面、2.x Home 界面或 Web 服务。

    如果使用 GlassFish v3,另一种选择是使用 EJB 3.1 可嵌入的 API。这允许 Java SE 程序直接执行 EJB 同一 JVM 中的组件,无需使用服务器进程。

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

    没有。 EJB 规范只需要访问 EJB 组件的 来自同一 JVM 中同一应用程序的本地 EJB 接口。 一种选择是将 ejb-jar 打包在与 .war 相同的 .ear 中。一种 第二个选项,如果使用 GlassFish v3,是打包 EJB 组件 直接在.war中。

    GlassFish EJB 常见问题解答还包含有关此主题的更多详细信息。

    另请参阅:

    【讨论】:

    • 感谢您的宝贵时间。 1)“除了上面的名称,如果 EJB 只公开一个客户端视图(即它只实现一个接口或无接口视图),则容器也被授权映射 bean” - 但是它没有工作2)问题不在于本地和远程,而在于查找时在jndi名称中使用接口名称。
    • 不太清楚你想说什么。也许你可以在你的问题中添加一个例子。
    猜你喜欢
    • 1970-01-01
    • 2016-07-17
    • 2012-02-23
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多