当我部署EJB模块(包含会话bean)时;我在Glassfish控制台(在Netbeans中)看到下面的输出:
Info: EJB5181:Portable JNDI names for EJB NewSessionBean: [java:global/EJBModule1/NewSessionBean!com.Hello.NewSessionBeanRemote, java:global/EJBModule1/NewSessionBean]
Info: EJB5182:Glassfish-specific (Non-portable) JNDI names for EJB NewSessionBean: [com.Hello.NewSessionBeanRemote, com.Hello.NewSessionBeanRemote#com.Hello.NewSessionBeanRemote]
我有两个问题:
1) Why does the remote interface have a JNDI reference? I thought it was just the EJB.
2) Why is there a comma, which appears to separate two JNDI references per line?
答案 0 :(得分:3)
1)为什么远程接口有JNDI引用?我想到了 只是EJB。
它不是具有JNDI引用的RemoteInterface,它只是一个可移植的JNDI引用,它包含已实现的接口名称。
请参阅here中的以下说明:
客户端应用程序需要使用全局JNDI名称来查找EJB。所有 沿着ejb规范一直没有提到这种可移植性 全球的jndi名字。这允许每个供应商分配全局jndi 以特定于供应商的方式命名给EJB。这意味着客户 使用全局JNDI名称执行查找的代码本质上是 跨应用服务器供应商实施不可移植。
EJB 3.1通过强制要求每个容器来解决上述问题 必须为EJB分配(至少一个)定义良好的全局JNDI名称。该 EJB的(可移植)全局JNDI名称的一般语法是 形式:
<强>
java:global/[<application-name>]/<module-name>/<bean-name>!<fully-qualified-bean-interface-name>
强>除了上面的名称,如果EJB只公开一个客户端 view(即它只实现一个接口或无接口) 视图),容器也被强制将bean映射到
<强>
java:global/[<application-name>]/<module-name>/<bean-name>
强>其中
<application-name>
默认为没有包扩展名的包名称(.ear文件名)。这可以被覆盖 application.xml中。此外,仅适用于 bean被打包在.ear文件中。<module-name>
默认为捆绑名称(.war或.jar),不包含扩展名。同样,这可以在ejb-jar.xml中重写。- 醇>
<bean-name>
默认为bean的非限定类名。但是,如果@Stateful
或@Stateless
或@Singleton
使用该名称 属性,然后指定的值将用作bean 名称
和
2)为什么有一个逗号,它似乎将两个JNDI引用分开 每行?
因为逗号用于分隔列表中的条目:)问题1的答案也应该回答这个问题,有一个条目只包含bean名称和一个包含bean名称+接口名称的条目。