我遇到了一个问题,一旦未在业务接口中声明,我就无法调用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 界面中。
有什么建议吗?
答案 0 :(得分:1)
通常,您可以使用反射来访问对象的私有方法。但是,变量bean的实际底层对象不是FooBean,而是一个也实现FooLocal的代理对象。如果不将其添加到界面,将无法访问该私有方法。