1

在我们的项目(Osgi、Spring-Dm、Apache-Felix)中,当 BundleContext.getService() 返回 null 时,我们在生产中遇到了一些问题。它很少发生,而且不是一开始就发生,所以这不是配置错误的问题。

另一种方法是使用 ServiceTracker 来定位服务,但由于该错误非常罕见,我不确定更改它是否能解决问题。

4

4 回答 4

3

OSGi 规范说该方法返回

  • 与引用关联的服务的服务对象
  • 或 null if
    • 该服务未注册
    • ServiceFactory 返回的服务对象未实现其注册所在的类
    • ServiceFactory 抛出异常

我的第一个猜测是该服务未注册。

顺便说一句,使用 Spring-DM 应该使大多数对服务注册表的编程访问变得不必要。至少在我们的公司中,这些调用通常是被禁止的,并且只允许在较低级别的技术代码中使用。

于 2010-11-24T14:32:21.537 回答
1

Uberto,服务还没注册一点都不奇怪。OSGi 是动态的。服务来来去去。如果您在注册之前尝试访问服务,那么您将获得空值。

当您执行普通的 getService() 时,您有点假设该服务已经存在。如果您需要该服务在那里,您应该做一些涉及等待注册事件的事情。这可以通过 ServiceTracker 完成,但它的级别相当低。正如其他人所指出的,使用 Spring-DM 或声明式服务之类的东西使这变得非常简单和健壮。

于 2010-11-25T17:15:34.553 回答
0

我可以确认,如果您使用 ServiceTracker,可能会发生竞争条件!有时,即使服务已注册,ServiceTracker 也无法捕获服务。为了解决这个问题,我使用 waitForService() 而不是 getService()。

问候罗兰

于 2013-07-11T08:22:17.433 回答
0

如果 ServiceReference 不为空并且在 getService(serviceReference) 时获得空指针,则服务实现类未正确初始化。

确保服务实现类的构造函数是公共的,并且在创建对象时没有错误。

于 2019-05-01T10:41:46.443 回答