便携式JNDI公开了实现类

时间:2014-09-12 13:00:08

标签: java-ee ejb-3.0 java-ee-6 glassfish-4 wildfly

EJB 3.x

考虑遵循EJB实现远程接口

@Remote
public interface UnusualRemote {
...
}

@Stateless
public class UnusualBean implements UnusualRemote{
...
}

为Remote Interaface公开的可移植JNDI名称:

java:global/simplejee7/UnusualBean!com.example.UnusualRemote

我的问题是为什么客户应该知道实现类以通过jndi查找bean。具体来说,为什么人们不能仅使用接口名称 com.example.UnusualRemote

进行查找

3 个答案:

答案 0 :(得分:1)

我认为关键点是远程接口可以由多个EJB实现,如果客户端没有指定实现类,则Container无法识别选择哪一个。

答案 1 :(得分:1)

这确实很愚蠢。当设计便携式名称时,有人显然正在睡觉。命名方案旨在命名一个特定的bean实现,但它没有考虑实际的查找用例,如果bean确实实现了一个,那么它总是通过接口。

我不同意加布里埃尔的回答。当然,可以通过其界面查找bean。当您注入具有接口作为其类型的字段时,容器就完全相同。

要考虑的另一件事是“java:”命名空间通常会返回到本地JVM,不能用于远程查找。远程查找的指定非常严格,但由于JAX-RS,没有人想要解决此问题。

答案 2 :(得分:-1)

这就是我的想法/我所知道的: -

在Java中,例如,当您“实现/编码到接口”时以及“调用方法”时;你实际上调用了对接口“输入”的对象;界面暴露对象的视图。

此处最关键的信息是对象的标识或对象及其“视图”的“范围”;这正是存储在JNDI目录服务中的内容。 (JNDI树基本上存储了bean对象的代理,这些代理可以转换为接口名称。)

此处对象的标识是您分配给bean的JNDI名称(如果未分配,则为默认值),如果没有该名称,您将无法访问/标识该对象,并且该对象的视图是接口名称。 / p>

希望得到答案。添加到: -

更一般地说,确定全局可移植jndi bean名称的语法是: - java:global[/<app-name>]/<module-name>/<bean-name>

如果没有指定接口名称,则表示bean只实现一个接口或只有一个类型/视图,因此接口名称是可选的。

但是,可能存在bean暴露'多个客户端视图/实现多个接口'的情况;在这种情况下,可移植JNDI名称将如下所示: -

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