現在、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
注釈を使用すると、私のサーブレットが見つからない理由を理解してください!あなたが私を助ける前にもっと情報を提供する必要があるなら、私はそうすることを嬉しく思います。十分な情報を提供していない場合は、コメントに記入してください。
ありがとうございます!
デバッガを取り付けましたか?あなたは#doGetメソッドを実装していますか? – nateyolles
はい、私はデバッガを持っており、 'doGet'メソッドをオーバーライドしました。 '@ Reference'アノテーションが存在する場合、' doGet'メソッドには到達しません。しかし、アノテーションを削除すると、それは確実に達成されます。 – Pr4isethesun
即時をtrueに設定するとどうなりますか? – nateyolles