1

Restlet 2.1は、OSGi環境(Equinox)でバンドルとして(つまり、バンドル内のライブラリとしてではなく)実行します。問題は、RestletエンジンがRestlet拡張機能によって提供されるヘルパー(コンバーターなど)を検出しないことです。具体的には、EngineClassLoader#getResources()呼び出しは結果を返しません。拡張機能は、ターゲットプラットフォームにOSGiバンドルとしてもデプロイされます。

自動コンバーター登録は実際にOSGi環境内で機能することになっていますか?

4

3 に答える 3

1

実際、Restletは、専用のアクティベーターのおかげでこのような機能をサポートしています(org.restlet.engine.internalパッケージのActivatorクラスを参照してください)。

このアクティベーターは、バンドルをイントロスペクトして、次のことを確認します。

  • 登録サーバーに対応するサーバー
  • 登録済みクライアントに対応するサーバー
  • 登録済みクライアントに対応するオーセンティケーター
  • コンバーター

この機能を使用するには、OSGiエディションのRestletを使用する必要があることに注意してください。これは、アクティベータークラスが指定されたorg.restletバンドルのMANIFESTファイルを持っているのはOSGiエディションだけだからです。それ以外の場合は、バンドルのロード順序を気にする必要はありません...

お役に立てば幸いです。ティエリー

于 2012-12-03T17:44:36.790 に答える
0

Restlet-bundleが拡張機能を含むパッケージを明示的にインポートしない限り(そして、そうすべきではないと私は疑っています)、バンドルには分離されたクラススペースがあるため、それらをロードすることはできません。

考えられる解決策は、Restletバンドルにアタッチされたフラグメントとして拡張機能を提供することです。したがって、bundle-classloaderを使用するようにすると(ドキュメントには、 s classloaderを設定するEngineことでこれを実行できると記載されています)、フラグメントからクラスをロードできるようになります。

于 2012-11-29T09:34:15.873 に答える
0

実際、OSGiでは、クラス空間全体を表示できるかどうかに依存するため、完全には機能しません。

OSGiでこれを行う方法は、拡張機能にサービスレジストリを使用することですが、これはOSGi対応ライブラリでのみ機能します。

途中でいくつかの助けがあります:最近リリースされたOSGi 5(Service Loader Mediator)では、META-INF /サービス(Restletがそれらを使用するかどうかはわかりません)をOSGiサービスに「ブリッジ」するサポートがあります。 「レガシー」ライブラリはOSGi内でうまく機能するはずです。

ApacheAriesにはSpi-Flyと呼ばれる実装があります。少し前に見てみました。それはあなたのためにトリックをするかもしれません、そうでないかもしれません。

于 2012-11-30T10:06:57.487 に答える