1

我遇到了一个问题,一旦没有在业务接口中声明,我就无法调用 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接口中不存在。

有什么建议吗?

4

1 回答 1

1

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

于 2012-09-21T21:28:47.663 回答