【问题标题】:Declarative Service bind-Method not found未找到声明式服务绑定方法
【发布时间】:2012-11-07 07:07:10
【问题描述】:

我想使用声明式服务,但抛出绑定方法不可访问或找不到的错误:

!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 添加到我的清单中

【问题讨论】:

  • 您没有在服务描述符中指定任何包名称 - 您确定没有歧义吗?
  • 是的。您需要完全限定的类型名称。您还需要确保服务提供者和服务使用者使用包含服务类型的相同包。

标签: java eclipse osgi


【解决方案1】:

这是几年前的事了;但是我今天收到了同样的错误信息。我有一个不同的问题:

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

【讨论】:

    【解决方案2】:

    可能是两个问题:

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

    2) 将这些属性添加到您的两个服务 activate="activate" immediate="true" 以强制捆绑激活。

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

    附言 我看不到的另一件事是您的实现类的完全限定类名。

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2017-01-24
      • 2010-09-23
      相关资源
      最近更新 更多