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