1

宣言型サービスに問題があります。2つのバンドルがあります。1つはサーバープロバイダーで、もう1つはサービスを使用するユーザーインターフェイスです。

サーバー側では、実装は次のとおりです。

public boolean checkUser(){
    return true;
}

そして、OSGi-INFフォルダー内のXMLファイル:

<component name="ZBService">
<implementation class="service.ZBService" />
   <service>
     <provide interface="service.IZBService" />
   </service>
</component>

クライアント側では、実装は次のとおりです。

public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService{
   IZBService zb;

   public void setZBService(IZBService eventAdmin) {
      this.zb = eventAdmin;
   }

   public void unsetZBService(IZBService eventAdmin){
      if(this.zb == eventAdmin){
          this.zb = null;}
   }
   public boolean greetServer(String input, String input2) throws Exception {
      return zb.checkUser();
   }
}

そしてXMLファイル:

<component name="ZBService">
  <implementation class="main.java.com.gwt.app.server.GreetingServiceImpl" />
   <service>
        <provide interface="main.java.com.gwt.app.client.GreetingService"/>
   </service>
   <reference name="zb" interface="service.IZBService" bind="setZBService" unbind="unsetZBService" cardinality="0..n" policy="dynamic" />
</component>

また、マニフェストファイルにタグService-Componentを含め、ACTIVEであるequinoxdsバンドルをデプロイしました。

クライアントはGWTユーザーインターフェイスであり、GWTのサーバー側にサービス参照を挿入します。Equinoxにアプリケーションをデプロイすると実行されますが、ボタンを押すと、ZBServiceを呼び出すイベントを起動します。アプリケーションをデバッグしましたが、エラーはzb属性がnullです。つまり、依存関係は注入されません。ただし、サービスはEquinoxで公開されています。Equinoxコンソールでサービスを作成すると、サービスが展開されます。次に、私の結論は、エラーは注入が実行されないためです。

誰かが理由を知っているかどうか知りたいですか?

よろしくお願いします!!

いい日

編集:

私はあなたの提案をしましたが、それは実行されません。コンポーネント名と条件/ポリシーを変更します。結果は同じです->インジェクションが行われないため、NullPointerExceptionが発生します。

また、アプリケーションをデバッグして、メソッドbindやunbindが呼び出されているかどうかを確認しましたが、呼び出されていません。

完全なクラスは次のとおりです。

public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService{
static protected IZBService zb;

public GreetingServiceImpl(){
    System.out.println("Constructor GreetingServiceImpl");
}

public IZBService getZb() {
    return zb;
}

public void setZb(IZBService zb) {
    GreetingServiceImpl.zb = zb;
}

public void unsetZb(IZBService zb) {
    GreetingServiceImpl.zb = zb;
}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    // Cache the current thread
    Thread currentThread = Thread.currentThread();
    // We are going to swap the class loader
    ClassLoader oldContextClassLoader = currentThread.getContextClassLoader();
    currentThread.setContextClassLoader(this.getClass().getClassLoader());
    super.service(req, resp);
    currentThread.setContextClassLoader(oldContextClassLoader);
}

public void activate(ComponentContext context) {
    System.out.println("Creating new greeter for " + context.getProperties().get("name")
            + ": " + context.getComponentInstance().toString());
}

public void activate() {
    System.out.println("Activando la referencia al servicio");
}

public void deactivate(ComponentContext context) {
    System.out.println("Deactivating greeter for " + context.getProperties().get("name")
            + ": " + context.getComponentInstance().toString());
}

public boolean greetServer(String input, String input2) throws Exception {
    return zb.checkUser();
}
}

そして、XMLクライアントは次のとおりです。

<?xml version="1.0" encoding="UTF-8" ?>
<scr:component name="serviceZB" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
<implementation class="main.java.com.gwt.app.server.GreetingServiceImpl" />
<!-- <service>
    <provide interface="main.java.com.gwt.app.client.GreetingService"/>
</service> -->
<reference name="zb" interface="service.IZBService"
    bind="setZb" unbind="unsetZb" cardinality="1..1"
    policy="static" />
</scr:component>

サービスがデプロイされている場合、なぜサービスが注入されないのですか?

4

2 に答える 2

2

試すことができるもののリストは次のとおりです。

  • まず、zbの「静的」を削除します。これが問題になる可能性があります。
  • Equinoxを使用している場合は、VM引数に-Dequinox.ds.print = trueフラグを追加して、XMLの解析などの詳細を確認してください。
  • もちろん、sysoutsをsetZBとunsetZBに追加します:)
  • IZBServiceの実装には、引数のないコンストラクターが必要であることを忘れないでください
  • Equinoxを使用している場合は、「list -c」コマンドを使用して各コンポーネントの情報を取得します(コンポーネントが登録されていない理由を正確に説明しているので便利です)。
  • XMLで「inmediate=true」を設定して、強制的に即時アクティベーションを行います。
于 2011-06-01T12:21:36.637 に答える
1

同じ名前の両方のコンポーネントがあります。これは、それらについて説明するときに少し厄介です。

クライアント側の参照には、cardinality = "0..n" policy="dynamic"があります。これは、0からn個の参照でアクティブ化できることを意味します。しかし、あなたのコードはこれを処理しません。正確に1つの参照を期待しているようです。おそらく、cardinality = "1..1" policy="static"を使用する必要があります。

于 2011-05-27T14:01:58.130 に答える