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
进行查找答案 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>