karaf osgi getServiceReference返回null

karaf osgi getServiceReference返回null,service,osgi,bundle,apache-karaf,osgi-bundle,Service,Osgi,Bundle,Apache Karaf,Osgi Bundle,是否有人有过无理由返回getServiceReference的经验 下面的bundle注册服务,然后继续确认它已注册(无论这是否是来自同一个包idk的有效测试) 获取注册服务的代码如下所示: import db.connector.DatabaseConnector; ... public List<Protocol> printAllEntries() { ServiceReference sr = Activator.getContext().ge

是否有人有过无理由返回
getServiceReference
的经验

下面的bundle注册服务,然后继续确认它已注册(无论这是否是来自同一个包idk的有效测试)

获取注册服务的代码如下所示:

import db.connector.DatabaseConnector;
    ...
    public List<Protocol> printAllEntries() {
        ServiceReference sr = Activator.getContext().getServiceReference(DatabaseConnector.class.getName());
        DatabaseConnector dbc = (DatabaseConnector) Activator.getContext().getService(sr);
        return dbc.getAllProtocols();
    }
    ...
导入db.connector.DatabaseConnector;
...
公共列表printalentries(){
ServiceReference sr=Activator.getContext().getServiceReference(DatabaseConnector.class.getName());
DatabaseConnector dbc=(DatabaseConnector)Activator.getContext().getService(sr);
返回dbc.getAllProtocols();
}
...
DatabaseConnector捆绑包导出正确的包,使用该服务的捆绑包导入相同的包

这里可能出了什么问题?我完全不知所措。

看起来还不错

我想到的是:订购可以吗?您确定在检查参考资料之前已完成注册吗?您签入printAllEntries的方式是检查服务是否就在此时。由于OSGi捆绑包可以来来往往,这不是一种可靠的检查方法。您应该使用ServiceTracker,或者更好地使用声明性服务或Blueprint

您可以将ServiceListener添加到BundleContext,然后可以按什么顺序打印发生的事情

希望这有帮助。

看起来不错

我想到的是:订购可以吗?您确定在检查参考资料之前已完成注册吗?您签入printAllEntries的方式是检查服务是否就在此时。由于OSGi捆绑包可以来来往往,这不是一种可靠的检查方法。您应该使用ServiceTracker,或者更好地使用声明性服务或Blueprint

您可以将ServiceListener添加到BundleContext,然后可以按什么顺序打印发生的事情


希望这有帮助。

事实证明,只是我没有刷新OSGi捆绑包。我的servlet指向一个现已过时的bundle ID,因此服务查找当然失败了。

结果是,我没有刷新OSGi bundle。我的servlet指向一个现已过时的bundle ID,因此服务查找当然失败了。

是的,使用服务跟踪器更好。是的,使用服务跟踪器更好。
267 [db.connector.DatabaseConnector]    database-connector (144)
import db.connector.DatabaseConnector;
    ...
    public List<Protocol> printAllEntries() {
        ServiceReference sr = Activator.getContext().getServiceReference(DatabaseConnector.class.getName());
        DatabaseConnector dbc = (DatabaseConnector) Activator.getContext().getService(sr);
        return dbc.getAllProtocols();
    }
    ...