【问题标题】:locate ejb implementation class (not interface)定位 ejb 实现类(不是接口)
【发布时间】:2013-07-08 07:12:19
【问题描述】:

我想浏览我的服务器的 jndi 注册表(例如 jboss)并为每个 ejb 找到它的实现类。例如,假设我有本地 bean

@Stateless(name="fooService")
public class FooServiceBean implements FooService () { ... }

and the interface

@Local
public interface FooService { ... }

我从 jndi 中检索它:

Context ctx = new InitialContext();
Object obj = ctx.lookup("fooService");

现在的问题..我怎么知道 obj 是 FooServiceBean 的实例?

2013 年 9 月 25 日更新:到目前为止,我还没有发现这是可能的,实际上它是有道理的。 JNDI 只托管接口。

【问题讨论】:

  • 你可以使用instanceof操作符。
  • @NiteshMishra 不,这不起作用:EJB 查找的结果将是一个代理,而不是实际的 EJB 实例。
  • @bkail 我确认这一点;它是一个代理,它持有对接口的引用
  • @bakil:我知道它不起作用,因为 JNDI 查找返回远程接口的实例而不是 bean。即使您仅通过 JNDI 查找也无法获取本地接口的实例。因为任何本地接口都不存在任何 JNDI。但是根据问题,询问如何检查对象是否是类的实例。为此,我没有比instanceof 更好的答案了:P.
  • 您不使用 EJB 或 Inject 注释的任何特殊原因?

标签: jakarta-ee ejb jndi


【解决方案1】:

这并不能回答您的问题,但是:

您的客户不应该真正知道接口是通过哪种机制实现的。这将是一个糟糕的设计,因为它将您的客户端耦合到实现而不是接口。您的 bean 实现类由应用程序服务器运行时管理。客户不应该知道它的存在。

【讨论】:

    【解决方案2】:

    这听起来像是错误的方法。为什么您的客户需要/想知道?将接口与实现分离的目的是使客户端与实现更改隔离。如果你真的需要知道,你可以添加一个 isFooServiceBean() 方法,该方法从 FooServiceBean 返回 true,但从所有其他实现返回 false,但听起来有些设计错误。

    【讨论】:

    • 我想浏览 jndi...获取(以某种方式)对象并使用反射来查看它们是否包含一些信息。我不拥有原始对象,因此我不能通过添加额外的方法来修改它们。问题是 jndi 被设计为只包含接口......因此任何实现类都可以在运行时绑定到它们......
    • JNDI 没有这样的限制,但是 EJB 并不是为做你想做的事而设计的,抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2018-09-04
    相关资源
    最近更新 更多