我使用GF4服务器,在它的日志中有:
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]]:EJB com.test.cms.svr.web.Service2的可移植JNDI名称
我的问题:
发布于 2014-06-15 22:06:45
为什么有两个jndi名称?有接口的和没有接口的?
这是一个名为可移植JNDI名称的EJB3.1特性。这是来自这个博客的很好的解释
客户端应用程序需要使用全局JNDI名称来查找EJB。一直以来,ejb规范都没有提到这种全局jndi名称的可移植性。这允许每个供应商以特定于供应商的方式为EJB分配全局jndi名称。这意味着使用全局JNDI名称执行查找的客户端代码在appserver供应商实现中本质上是不可移植的。 EJB3.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>默认为没有包扩展名的包名(.ear文件名)。这可以在application.xml中重写。而且,只有当bean被打包在.ear文件中时,才适用。<module-name>默认为没有包扩展的包名(.war或.jar)。同样,这可以在ejb-jar.xml中重写。<bean-name>默认为bean的非限定类名。但是,如果@Stateful、@Stateless或@Singleton使用name属性,那么那里指定的值将用作bean名称。在GlassFish EJB中还有一些特定于GlassFish的附加信息。
为什么只能使用带有接口的jndi名称(即使EJB只是本地的)?
我猜您的意思是在同一个JVM中从同一个web应用程序中的另一个EJB或模块中查找。否则,如果没有@Remote接口,这是不可能的。以下是来自GlassFish EJB的两条语句:
我有一个带有本地接口的EJB组件。我可以从应用程序客户机或独立的java客户机访问它吗? 如果EJB组件正在服务器中运行,则否。EJB视图是一个优化的调用路径,它使用了按引用调用的语义。它仅适用于与目标EJB组件相同应用程序的web组件和EJB组件。 要从应用程序客户机或独立的java客户机访问服务器中运行的EJB组件,您需要使用远程3.x业务接口、2.x家庭接口或web服务。 如果使用GlassFish v3,一种选择是使用EJB3.1可嵌入的API。这允许Java SE程序直接在同一个JVM中执行EJB组件,而无需使用服务器进程。 我有一个带有本地接口的EJB组件。我可以从不同应用程序中的web组件访问它吗? 不是的。EJB规范只需要从同一个JVM中的同一个应用程序中访问EJB组件的本地EJB接口。一种选择是将ejb封装在与.war相同的.war中。如果使用GlassFish v3,第二个选项是直接将.war组件打包到.war中。
GlassFish EJB还包含关于这个主题的更多更详细的信息。
还请参见:
https://stackoverflow.com/questions/24221358
复制相似问题