在我们的项目(Osgi、Spring-Dm、Apache-Felix)中,当 BundleContext.getService() 返回 null 时,我们在生产中遇到了一些问题。它很少发生,而且不是一开始就发生,所以这不是配置错误的问题。
另一种方法是使用 ServiceTracker 来定位服务,但由于该错误非常罕见,我不确定更改它是否能解决问题。
在我们的项目(Osgi、Spring-Dm、Apache-Felix)中,当 BundleContext.getService() 返回 null 时,我们在生产中遇到了一些问题。它很少发生,而且不是一开始就发生,所以这不是配置错误的问题。
另一种方法是使用 ServiceTracker 来定位服务,但由于该错误非常罕见,我不确定更改它是否能解决问题。
OSGi 规范说该方法返回
- 与引用关联的服务的服务对象
- 或 null if
- 该服务未注册
- ServiceFactory 返回的服务对象未实现其注册所在的类
- ServiceFactory 抛出异常
我的第一个猜测是该服务未注册。
顺便说一句,使用 Spring-DM 应该使大多数对服务注册表的编程访问变得不必要。至少在我们的公司中,这些调用通常是被禁止的,并且只允许在较低级别的技术代码中使用。
Uberto,服务还没注册一点都不奇怪。OSGi 是动态的。服务来来去去。如果您在注册之前尝试访问服务,那么您将获得空值。
当您执行普通的 getService() 时,您有点假设该服务已经存在。如果您需要该服务在那里,您应该做一些涉及等待注册事件的事情。这可以通过 ServiceTracker 完成,但它的级别相当低。正如其他人所指出的,使用 Spring-DM 或声明式服务之类的东西使这变得非常简单和健壮。
我可以确认,如果您使用 ServiceTracker,可能会发生竞争条件!有时,即使服务已注册,ServiceTracker 也无法捕获服务。为了解决这个问题,我使用 waitForService() 而不是 getService()。
问候罗兰
如果 ServiceReference 不为空并且在 getService(serviceReference) 时获得空指针,则服务实现类未正确初始化。
确保服务实现类的构造函数是公共的,并且在创建对象时没有错误。