2016-06-21 13 views
0

現在、Apache Felix経由でOSGiフレームワークを使用するSlingサーブレットに取り組んでいます。私が理解しているとおり、別のサービスを取得して使用する場合は、次の2つのオプションがあります。 1.サービスを取得して使用する前に、必要なサービスが登録されていることを確認するサービスリスナーを作成します。 2. Apache Felixの@Referenceアノテーションを使用してサービスを取得します。Apache Felix @リファレンス注釈の問題

オプション2は、オプション1は、書く必要がないコードがたくさん必要です。

ここで私はそれをやったことがあります。免責条項:以下は、私のコードのスニペットであり、私のプロジェクト全体を構成するものではありません。これをコンパイルできるとは思わないでください。私は、私が関連する部分であると信じているものを含めました。

まず、私は私のスリングサーブレットを持っている:

package mypackage; 
import /*necessary imports*/ 

@Component(name = "My Sling Servlet", immediate = false, metatype = true) 
@Properties({ 
    @Property(name = "sling.servlet.paths", value = "/bin/mytest"), 
    @Property(name = "sling.servlet.methods", value = "GET") 
}) 

@Service(Servlet.class) 
public class MyServlet extends SlingSafeMethodsServlet { 
    @Reference 
    private MyService service; 

    // Do stuff with service 
} 

私の知る限り理解し、@Component注釈は、OSGiは、このクラスファイルは、コンポーネントを定義することを知ることができます。 @Propertiesアノテーションは、コンポーネントの必須プロパティのいくつかを定義します(この場合、[hostname]/bin/mytestに移動することでこのサーブレットを実行できるようになりました)。 @Serviceアノテーションを使用すると、OSGiはこのクラスがサービス(特にServletクラスを実装するサービス)であることを認識し、サービスも登録します。最後に、@Referenceアノテーションは、OSGiに、私たちが宣言しようとしているフィールドが、このバンドルにすでに登録されているOSGiサービスであり、それを取得するだけであることを伝えます。ここで

package mypackage; 
import /*necessary imports*/ 

@Component(name="MyService", immediate=false,metatype=true) 

@Service(value = MyServiceInterface.class) 
public class MyService implements MyServiceInterface { 
    // Implementation of MyServiceInterface 
} 

は、我々はMyServiceでは@Componentアノテーションを使用したOSGi構成要素であることを宣言している:

は今、ここにサービスMYSERVICEを定義する別の関連ファイル、です。ここで重要なのは、@Service注釈を使用したことです。これは明らかに不可欠なタスクを実行します。注釈サービスを登録します。ここでは、道のうち、これらの予選のすべてと

package mypackage; 
import /*necessary imports*/ 

public interface MyServiceInterface { 
    //stuff 
} 

私の問題です:

は、ちょうどそこに次のようになりますファイルMyServiceInterface.javaであると仮定してください。 Webブラウザで[hostname]/bin/mytestにアクセスしてサーブレットを実行すると、404ページが見つかりませんでした。これは私のブラウザがサーブレットを見つけることができないことを示します。

これはなぜ、これが@Reference注釈と何らかの形で関連していると思うのかと自問自答しているかもしれません。さて、コメントアウトして旧式の方法(上記の方法1)を取得すると、サーブレットは何の問題もなく実行されるため、何らかの原因があると思います。

もう一つの潜在的に重要な情報は、私がMavenを使ってこのプロジェクトを構築していることです。関連するpom.xmlファイルに有用な情報が含まれていると思われる場合は、それを提供しています。

@Reference注釈を使用すると、私のサーブレットが見つからない理由を理解してください!あなたが私を助ける前にもっと情報を提供する必要があるなら、私はそうすることを嬉しく思います。十分な情報を提供していない場合は、コメントに記入してください。

ありがとうございます!

+0

デバッガを取り付けましたか?あなたは#doGetメソッドを実装していますか? – nateyolles

+0

はい、私はデバッガを持っており、 'doGet'メソッドをオーバーライドしました。 '@ Reference'アノテーションが存在する場合、' doGet'メソッドには到達しません。しかし、アノテーションを削除すると、それは確実に達成されます。 – Pr4isethesun

+0

即時をtrueに設定するとどうなりますか? – nateyolles

答えて

0

私が常にやるべきことは、自分のバンドルとサーブレットがApache Felixコンソール(http://localhost:8080/system/console/bundleshttp://localhost:8080/system/console/components)でアクティブになっているかどうかを確認することです。あなたのバンドルやコンポーネントがアクティブにならないような、欠けている依存関係がありますか?

私の最初の推測では、Apache Felix Maven SCR Pluginを使用していない可能性があります。あなたが述べたように、あなたは手動でServiceListenerを作成する必要はなく(宣言したオプション1)、Declarative Services(指定したオプション2)を使用し、SCRプラグインが必要です。 @Referenceなどの注釈は実行時ではなく、宣言型サービスでOSGi環境でサービスを動作させるために必要なコードとメタデータをSCRプラグインが生成するために使用されます。上で提供されたドキュメンテーションリンクは、プラグインの機能の詳細な説明を提供します。マニュアルに示されているようにちょうどあなたのpom.xmlファイルにプラグインを追加します。

<project> 
    ... 
    <build> 
    ... 
    <plugins> 
     ... 
     <plugin> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>maven-scr-plugin</artifactId> 
     <version>1.20.0</version> 
     <executions> 
      <execution> 
      <id>generate-scr-scrdescriptor</id> 
      <goals> 
       <goal>scr</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
     ... 
    </plugins> 
    ... 
    </build> 
    ... 
</project> 

Using the Apache Felix Maven SCR Plugin to generate Declarative Services and Metatype Service descriptors during a Maven Buildを参照してください。

+0

お返事ありがとうございます!これらは両方ともチェックするのに適しています。コンポーネントに関しては、すでにコンソール経由でアクティブであることを確認しました。 SCRプラグインに関しては、私が 'pom.xml'ファイルに含まれていることを確認しました。それにもかかわらず、私はまだ同じ問題を抱えています。ご協力いただきありがとうございます。 – Pr4isethesun

0

サーブレットが参照なしで動作し、参照を追加するとすぐに動作しなくなった場合は、参照自体が問題になるはずです。

最も明白な解決策は、参照がアクセスできない(何らかの理由で、サービスインターフェイスクラスがエクスポートされていないが、別のバンドルにある可能性があります)ためです。その場合、サーブレットは起動しません。

サーブレットは/ system/console/componentsにありますか、それとも対応するコンポーネントだけをチェックしましたか?

ところで、あなたのサーブレットにこれらの注釈がすべて必要なわけではありません。 @SlingServlet(paths = {"/ bin/mytest"}、metatype = false、generateService = true) @Componentと@Serviceを削除できます。

関連する問題