如果未在业务接口中声明,则如何调用无状态bean方法

时间:2012-09-21 20:41:38

标签: java casting ejb

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

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

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

每个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);
}

最后是Local Home界面:

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 界面中。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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