声明服务绑定方法未找到

时间:2012-11-19 11:05:02

标签: java eclipse osgi

我想使用声明性服务,但是抛出了一个错误,即bind方法无法访问或找不到:

!MESSAGE [SCR] ComponentReference.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>

这两个方法在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的fab教程,但我找不到我的错误

编辑:我将Service-Component:OSGI-INF / serviceprovider.xml,OSGI-INF / managmentConsumer.xml添加到我的Manifest

2 个答案:

答案 0 :(得分:1)

这已经是几年前的事了;但是我今天得到了同样的错误信息。我遇到了另一个问题:

我忘记让服务提供者类实现服务接口。 OSGi服务器可能无法将实例强制转换为接口,因此无法使用参数为接口的我的方法。要解决此问题,我只需要添加一个implements MyInterface

答案 1 :(得分:0)

可能存在两个问题:

1)通过在清单编辑器的构建选项卡中选择它,确保您的OSGI-INF文件夹位于构建路径上。

2)将这些属性添加到您的两个服务中激活=“激活”立即=“真”,强制捆绑激活。

3)另一个提示是将政策从动态删除到“静态”,我打赌这将解决您的问题。 - 邓肯

P.S 我没看到的另一件事是完全限定的类名实现类。