3

私は既存のレガシー戦争からosgiバンドルを作成しました。このアプリには、SpringインターフェイスApplicationContextAwareを実装するクラスがあり、コンテキストを使用してプログラムでBeanを取得します(理由はわかりませんが、最終的にはリファクタリングが必要です)。アプリは現在OsgiBundleXmlApplicationContextを使用していますが、これを使用すると、ApplicationContextAwareを実装するクラスでsetApplicationContextメソッドが呼び出されないという問題があるため、このクラスのコンテキストは常にnullになります。

そのため、回避策としてBundleContextAwareを実装し、公開されたコンテキストへの参照を取得して、その方法でBeanにアクセスできるようにしました。これは問題なく機能しますが、コンテキスト上の唯一のBeanはwarDeployerです(戦争を展開するためにspring dmバンドルspring-extenderを使用していることに言及する必要があります)。コンテキストに存在するバンドルは私のバンドルであるため、取得しているコンテキストにBeanが含まれていない理由がわかりません。アプリケーションコンテキストを取得する必要があるコードは次のとおりです。

ServiceReference ref = bundleContext.getServiceReference(ApplicationContext.class.getName()); applicationContext = (OsgiBundleXmlApplicationContext) bundleContext.getService(ref);

ログを見ると、コンテキストの多くが作成されていることがわかります。そのため、取得しているコンテキストにコンテキストがない理由がわかりません。

誰かが何が悪いのかアドバイスできますか?このアプローチは少しハッキーだと理解していますが、既存のコードがリファクタリングされるまでは一時的なものです。

前もって感謝します。

バリー

4

1 に答える 1

1

ApplicationContextサービスはSpring-DMエクステンダーによって非同期的に登録されていると思います。したがって、競合状態にある可能性があります。つまり、実際に登録される直前にサービスを要求します。

遅延を導入することもできますが、それでは厄介なハッキング領域に非常に深く入り込んでいます。BeanのsetApplicationContextメソッドが設定されていない理由を理解することをお勧めします。ApplicationContextAwareこれはSpring-DMに対するバグであるか、Spring-DMGoogleグループに問い合わせてみてください。

于 2010-12-03T01:08:31.490 に答える