当我部署我的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?
1)为什么远程接口有JNDI引用?我是这么想的就是EJB。
它不是有JNDI引用的RemoteInterface,它只是一个可移植的JNDI引用,其中包括被实现的接口的名称。
请看下面的解释:
客户端应用程序需要使用全局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只公开一个客户端视图(即它只实现一个接口或没有接口)视图),容器还被强制将bean映射到
java:global/[<application-name>]/<module-name>/<bean-name>
,
<application-name>
默认为包名。(文件名),没有包扩展名。中可以重写application.xml。此外,仅在bean被打包在.ear文件中。<module-name>
默认为bundle name()。War或.jar),没有包扩展名。同样,这也可以在ejb-jar.xml中重写。<bean-name>
默认为bean的非限定类名。但是,如果@Stateful
或@Stateless
或@Singleton
使用该名称属性,则在那里指定的值将用作bean名字。
和
2)为什么有逗号,它似乎分隔了两个JNDI引用每一行吗?
因为逗号用于分隔列表中的条目:)问题1的答案也应该回答这个问题,有一个条目只包含bean名称,另一个条目包含bean名称+接口名称