2011-08-02 15 views
2

私はRestletフレームワーク(バージョン2.08)を魅了しています。これは私が現在OSGi環境でRestletを使って私の論文の実用的な部分をしようとしている理由です。最後に、サーバーバンドル(私のFelix OSGi環境でActivatorによって起動される)を作成し、http://localhost:8888/のような単純な呼び出しに対する応答としてメッセージを表示するようになりました。Restlet OSGiのHTTPの問題

しかし、私はRestletから別のリソースを受け取ることに成功しません。 http://localhost:8888/testの結果を計算するために、http://localhost:808​0/tripleStore/triple​s/5のデータが必要な場合を想像してください。私は私のRestletからhttp://127.0.0.1:808​0/tripleStore/triple​s/5を呼び出すとき(コードスニペットは、次の...)

public void startServer() throws Exception { 
    component = new Component(); 
    Server server = new Server (Protocol.HTTP, 8888); 
    component.getServers​().add(server); 
    Client client = new Client (Protocol.HTTP); 
    component.getClients​().add(client); 

    Restlet restlet = new Restlet() { 
     @Override 
     public void handle(Request request, Response response) { 
     response.setEntity("Container Resource is active!", MediaType.TEXT_PLAIN); 
     } 
    }; 

    Restlet restletTest = new Restlet() { 
     @Override 
     public void handle(Request request, Response response) { 
     RdfClientResource cli = new RdfClientResource("http://localhost:808​0/tripleStore/triples/5"); 
     cli.setFollowingRedi​rects(false); 
     Representation repri = cli.get(); 
     response.setEntity(repri); 
     } 
    }; 

    component.getDefault​Host().attach("/cont​ainer",new Sink()); 
    component.getDefault​Host().attach("/test​",restletTest); 
    component.getDefault​Host().attach(restle​t); 
    component.getClients​().add(Protocol.HTTP​); 
    component.start(); 
} 

現在、私は、「不正な要求」を取得-error私は私のRestletに http://localhost:808​0/tripleStore/triple​s/5を呼び出すときに「禁止」-errorよ。

今後の研究では、このエラーの原因が非常に簡単であることが示されています。レセプタクルは、ネットワークプロキシから直接結果を取得しようとします。これは、localhostを知らず、127.0.0.1への呼び出しを禁止します。

もう1つの重要な点は、1回の試行中を除いて、エラーは常に複製可能であったことです。この場合、すべて正常に機能しました。これが私がOSGiの起動順序との関係を想定している理由です。 (これは修正されておらず、Sonatype Aether-frameworkに依存します)

あなたはすでにこのようなエラーに気付いていますか? OSGiのスタートアップ注文をすべて手作業で試してみることを避けるためのバグフィックスをお勧めしますか?私がOSGiの外でこれらのことをしようとすると、すべてうまく動作します。

ありがとうございます! Marcus

答えて

1

あなたの問題は、私が持っていた問題を思い出させます。クライアントコネクタはRestletエンジンに対して自動的に登録されます。ここでの問題は、バンドルローディングの順序です。

私の問題はHTTPSコネクタに関するものでした。クライアントコネクタを追加しようとすると、コネクタを提供するバンドルが既にロードされていることを確認する必要があります。そうでなければ、私はトレースにそのような何かが表示されます:

Internal Connector Error (1002) - No available client connector supports the required 
protocol: 'HTTPS'. Please add the JAR of a matching connector to your classpath. 

をおそらく、あなたのクライアントのコネクタを追加する前に、あなたはロードされたバンドルをチェックし、RESTリクエスト、登録済みのクライアントコネクタを実行する前にすることができますか?ここで

は、登録されたクライアントコネクタを参照するためのコードです:

List<ConnectorHelper<Client>> clients = Engine.getInstance().getRegisteredClients(); 
System.out.println("Connectors - "+clients.size()); 
for (ConnectorHelper<Client> connectorHelper : clients) { 
    System.out.println("connector = "+connectorHelper.getClass()); 
} 

あなたが必要なバンドルがロードされているかどうかを確認するためのOSGiバンドル・リスナーを使用することができます。ここでは、コードのサンプルです:

// Checking the bundle loading in the future 
bundleContext.addBundleListener(new BundleListener() { 
    public void bundleChanged(BundleEvent event) { 
     if (event.getBundle().getSymbolicName().equals("org.restlet.ext.ssl") 
         & event.getBundle().getState()==BundleEvent.RESOLVED) { 
      registerClientConnector(); 
     } 
    } 
}); 

// Checking if the bundle is already present 
Bundle[] bundles = bundleContext.getBundles(); 
for (Bundle bundle : bundles) { 
    if (bundle.getSymbolicName().equals("org.restlet.ext.ssl") 
       && bundle.getState()==BundleEvent.RESOLVED) { 
     registerClientConnector(); 
    } 
} 

registerClientConnector方法は、単にそのようなことを行います。component.getClients()(Protocol.HTTPS)を追加;.。

お手伝いします。私が問題を再現するための最小限のプロジェクトを私に送ることをためらって、より正確に助けることができます。 Thierry