【问题标题】:How to invoke a stateless bean method if it is not declared in business interface如果没有在业务接口中声明,如何调用无状态bean方法
【发布时间】:2012-09-21 20:41:37
【问题描述】:

我遇到了一个问题,一旦 bean 实例的方法没有在业务接口中声明,我就无法调用它。

基本上,在我开始使用另一个团队开发的 EJB 2.1 项目之后,我就遇到了这个问题。 应用服务器是 Websphere v8

问题如下: 我们有一个抽象类 FooAbstract,其中声明了基本的业务功能(如读取、删除、更新等)

当然,每个 bean 都必须扩展该类并实现抽象方法。 Bean 也可以有自己的公共方法(实际上有)。

由于某些原因,这些方法没有在业务接口中声明, 但是所有 bean 的方法都是通过反射而不是直接调用来调用的(我不知道为什么)。

在我看来,反射使系统比它可能的慢得多,但我无法处理架构,因为几乎所有需要的方法对于直接调用都是不可见的。

这是一个例子:

public abstract class FooAbstract {
    public abstract Object create();
    public abstract void delete(Object x);
}

一个执行业务逻辑的 FooBean 类(jndi 名称“Foo”):

public class FooBean extends FooAbstract implements SessionBean {
    /** inherited method */
    public Object create() {
        Object x = new SomeDBMappedObject();
        ...  // creating an object in DB and return wrapper class
        return x;
    }

    /** inherited method */
    public void delete(Object x) {
        ... // deleting object from DB
    }

    /** The method that performs some extra logic */
    aMethod() {
      ... //do extra logic
    }
}

本地业务接口:

public interface FooLocal extends EJBLocalObject {
    public abstract Object create();
    public abstract void delete(Object x);
}

最后是本地主页界面:

public interface FooLocalHome extends EJBLocalHome {
   public FooLocal create() throws CreateException;
}

根据架构规范,如果我需要调用另一个 EJB 的方法,我应该使用一些实用类 UtilityBean,它使用反射来调度我的调用。

类似:

...
   public static Object dispath(String jndi, String methodname, Object parameters) {
      ...
   }
...

最后,我的问题:

我想直接在我的 EJB 中调用 FooBean 的额外方法,但如果我这样做:

public void doSomething {
    InitialContext ctx = new InitialContext ();
    FooHome home = (FooHome) ctx.lookup("local:ejb/Foo");
    Object bean = home.create();
    ...
}

进入 "bean" 变量我得到了对 FooBean 实例的引用,但我不能调用方法 aMethod() 因为它没有存在于FooLocal界面中。

有什么建议吗?

【问题讨论】:

    标签: java casting ejb


    【解决方案1】:

    通常您可以使用反射来访问对象的私有方法。但是,变量 bean 的实际底层对象不是 FooBean,而是同样实现 FooLocal 的代理对象。如果不将其添加到接口,就无法访​​问该私有方法。

    【讨论】:

    • 谢谢,但我说的不是私有方法,而是公共方法。例如下一条语句将不起作用:FooBean bean = (FooBean) ((FooHome) ctx.lookup("local:ejb/Foo")).create(),但是代理对象实际上与 FooBean 相同。跨度>
    • 另一个例子:InitialContext ctx = new InitialContext(); FooHome home = (FooHome) ctx.lookup("local:ejb/Foo"); Object bean = home.create(); 如果我使用像Method method = FooBean.class.getMethod("aMethod"); method.invoke(bean, new Object[]() ); 这样的反射,它会起作用......((
    猜你喜欢
    • 2016-08-28
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多