私たちのプロジェクト(Osgi、Spring-Dm、Apache-Felix)では、BundleContext.getService()がnullを返すと、本番環境で問題が発生します。それはめったに起こらず、最初は起こらないので、設定ミスの問題ではありません。
別の方法として、ServiceTrackerを使用してサービスを見つけることもできますが、エラーは非常にまれであるため、変更することで状況が解決するかどうかはわかりません。
私たちのプロジェクト(Osgi、Spring-Dm、Apache-Felix)では、BundleContext.getService()がnullを返すと、本番環境で問題が発生します。それはめったに起こらず、最初は起こらないので、設定ミスの問題ではありません。
別の方法として、ServiceTrackerを使用してサービスを見つけることもできますが、エラーは非常にまれであるため、変更することで状況が解決するかどうかはわかりません。
OSGi仕様では、メソッドは
- 参照に関連付けられたサービスのサービスオブジェクト
- またはnullの場合
- サービスが登録されていません
- ServiceFactoryによって返されるサービスオブジェクトは、それが登録されたクラスを実装していません
- ServiceFactoryが例外をスローしました
私の最初の推測は、サービスが登録されていないということです。
ちなみに、Spring-DMを使用すると、サービスレジストリへのほとんどのプログラムによるアクセスが不要になります。少なくとも当社では、これらの呼び出しは一般的に禁止されており、低レベルの技術コードでのみ許可されています。
ウベルト、サービスがまだ登録されていないのはまったく奇妙なことではありません。OSGiは動的です。サービスは行き来します。登録される前にサービスにアクセスしようとすると、nullになります。
プレーンなgetService()を実行するときは、サービスがすでに存在していると想定しているようなものです。サービスが必要な場合は、代わりに登録イベントを待つことを含む何かを行う必要があります。これはServiceTrackerで実行できますが、かなり低レベルです。他の人が指摘しているように、Spring-DMや宣言型サービスのようなものを使用すると、これは非常に簡単で堅牢になります。
ServiceTrackerを使用すると、競合状態が発生する可能性があることを確認できます。サービスが登録されていても、ServiceTrackerがサービスをキャッチできない場合があります。この問題を解決するために、getService()の代わりにwaitForService()を使用します。
よろしくローランド
ServiceReferenceがnullでなく、getService(serviceReference)中にnullポインターを取得している場合、サービス実装クラスは適切に初期化されていません。
サービス実装クラスのコンストラクターがパブリックであり、オブジェクトの作成でエラーが発生しないことを確認してください。