6

Eclipse4rcpアプリケーションで使用するOSGiバンドルを作成しました。依存関係を追加し、これらのサービスをアクティベーターに登録してクラスに注入すると、サービスの使用法は正常に機能します。

アクティベーターで

IUserService service = new TestUserService();
context.registerService(IUserService.class.getName(), service, null);

私のクラスで

@Inject
IUserService service;

service.getSth();

宣言型サービスを介してバンドルを使用する方が良い方法であると読みました。だから私の実装を変更しました。サービスを提供するために、バンドルにコンポーネント定義を作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="usermanagement.test">
   <implementation class="usermanagement.test.TestUserService"/>
   <service>
      <provide interface="usermanagement.IUserService"/>
   </service>
</scr:component>

次に、アクティベーターからサービス登録を削除し、サービスコンシューマークラスを作成しました。

public class UserServiceConsumer {

    private IUserService service;

    public synchronized void setQuote(IUserService service) {
        this.service = service;
    }

    public synchronized void unsetQuote(IUserService service) {
        if (this.service == service) {
            this.service = null;
        }
    }

}

および別のコンポーネント定義:

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="UserServiceConsumer">
   <implementation class="services.UserServiceConsumer"/>
   <reference bind="setService" cardinality="1..1" interface="usermanagement.IUserService" name="IUserService" policy="static" unbind="unsetService"/>
</scr:component>

これらの変更後、私のサービスの注入は機能しなくなります。問題は、注入されたサービス参照が毎回NULLになることです。

誰かが理由を知っていますか?何か忘れましたか?

どうもありがとう!

4

3 に答える 3

3

デバッグするためにできることをいくつか提案できます。

  1. ランタイムに実際にscr実装がありますか?SCR(宣言型サービスの別名)はEquinoxコアに含まれていないため、含める必要があります。ほとんどの人はFelixSCRバンドルを使用します-それはEquinoxの上に非常に幸せに座ります。

  2. 宣言型サービスはサービスのみを使用するため、一度にアプリの半分を変更して、機能していないのがサービスの消費なのか登録なのかを特定できます。

  3. Equinoxコンソールを使用して、サービス登録を検査することもできます。「ss」を使用してバンドルを識別し、「bundle [no]」を使用して、登録および使用されているサービスを確認します。Felix SCRを使用している場合は、Equinoxコンソール拡張機能もあるため、「scr list」を使用して、バンドルが登録しようとするすべてのサービス(およびそれらの状態)を確認できます。「scrinfo」を使用して、特定の詳細を確認できます。サービス。

于 2012-11-18T07:16:47.663 に答える
3

私は解決策を見つけました。

私のサービスのマニフェストファイルに、次の行を追加しました。

Bundle-ActivationPolicy: lazy

その後、私のアプリケーションのuserServiceConsumerとコンポーネント定義は不要になります。

ビュークラスでは、次のことができます。

public class MyPart {

    private IUserService uServ;

    @Inject
    public MyPart(IUserService uServ) {
        this.uServ = uServ;
        if (uServ != null)
            System.out.println("UserService available");
        else
            System.out.println("UserService == null");
    }

DIを介して、私のサービスはビューのコンストラクターに注入されます。それは私のために働きます!

于 2012-11-18T12:48:36.943 に答える
2

宣言型サービスは、SCRではなくEclipseによって作成されるため、UIクラスでは機能しないと思います。したがって、試すことができるのは、UIをそのままにして@Inject、DSを使用するようにサービスを提供するバンドルのみを変更することです。

基本的にはUI側を変えようとはしません。表記は、@Inject宣言型サービスよりもはるかに少ないオーバーヘッドです。

于 2012-11-18T08:25:32.540 に答える