1

宣言型サービスを使用したいのですが、bind メソッドにアクセスできない、または見つからないというエラーがスローされます。

!MESSAGE [SCR] ComponentReference.bind(): bind メソッド 'setAreaManagment' が見つからないか、アクセスできません!

私は自分の間違いを見つけることができません。これが私のサービスインターフェースです:

IManagmentService

public interface IAreaManagmentService {
    SurfacePolygon getAreaByDatabaseID(int id);

    void setAreaVisibility(int databaseId, boolean visible);

    public void addArea(Integer objectId, Integer databaseId, double biggestLat, double biggestLon, double smallestLat,
            double smallestLon, String name, Date date);

    void removeAllAreas();

    public LinkedList<DisplayedArea> getAreas();
}

GlobeView (ViewPart を拡張) というクラスがこのインターフェイスを実装します。

サービスが「公開」されている XML ファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="visualization-servcieprovider">
   <implementation class="GlobeView"/>
   <service>
      <provide interface="IAreaManagmentService"/>
   </service>
</scr:component>

これは、サービスがバインドされる XML ファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" name="visualization-detailsview">
   <implementation class="DetailsView"/>
   <reference bind="setAreaManagment" cardinality="1..1" interface="IAreaManagmentService" name="IAreaManagmentService" policy="dynamic" unbind="unsetAreaManagment"/>
</scr:component>

これら 2 つのメソッドは、DetailsView.java にあります。

  public void setAreaManagment(IAreaManagmentService areaManagment) {
        System.out.println("AreaManagmentSet");

        this.areaManagment = areaManagment;

        System.out.println("WAS SET " + this.areaManagment);
    }

    public void unsetAreaManagment(IAreaManagmentService areaManagmentIn) {
        System.out.println("AreaManagmentUnSet");
        this.areaManagment = null;
    }

(もちろん、プライベート IAreaManagmentService areaMangment があります ;-) )

私の間違いはどこですか?Lars Vogella のすばらしいチュートリアルを読みましたが、間違いが見つかりません

編集: Service-Component: OSGI-INF/serviceprovider.xml、OSGI-INF/managmentConsumer.xml もマニフェストに追加しました

4

2 に答える 2

0

問題になる可能性のある2つのこと:

1) マニフェスト エディターの [ビルド] タブで OSGI-INF フォルダーを選択して、ビルド パス上にあることを確認します。

2) これらの属性を両方のサービス activate="activate" immediate="true" に追加して、バンドルを強制的にアクティブ化します。

3) もう 1 つのヒントは、ポリシーを動的から「静的」に削除することです。これで問題が解決するはずです。- ダンカン

PS私が見ていない他のことは、実装クラスの完全修飾クラス名です。

于 2012-11-20T00:41:41.977 に答える