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

そして最後に 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インスタンスへの参照を取得しますが、FooLocal インターフェイスに存在しないため、メソッド aMethod() を呼び出すことができません

何か提案はありますか?

4

1 に答える 1

1

通常、リフレクションを使用してオブジェクトのプライベート メソッドにアクセスできます。ただし、変数 Bean の実際の基礎となるオブジェクトは FooBean ではなく、FooLocal も実装するプロキシ オブジェクトです。インターフェイスに追加しないと、そのプライベート メソッドにアクセスすることはできません。

于 2012-09-21T21:28:47.663 に答える