【发布时间】: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 添加到我的清单中
【问题讨论】:
-
您没有在服务描述符中指定任何包名称 - 您确定没有歧义吗?
-
是的。您需要完全限定的类型名称。您还需要确保服务提供者和服务使用者使用包含服务类型的相同包。