我正在尝试在我的 RAP 应用程序中配置osgi-jax-rs-connector 。
自述文件说使用配置管理服务进行配置。
ServiceReference caRef = context
.getServiceReference(ConfigurationAdmin.class.getName());
上面的代码总是返回null
. ServiceReference
获取对 ConfigurationAdmin 的引用的正确方法是什么。之前是否需要启动另一个捆绑包?
我正在尝试在我的 RAP 应用程序中配置osgi-jax-rs-connector 。
自述文件说使用配置管理服务进行配置。
ServiceReference caRef = context
.getServiceReference(ConfigurationAdmin.class.getName());
上面的代码总是返回null
. ServiceReference
获取对 ConfigurationAdmin 的引用的正确方法是什么。之前是否需要启动另一个捆绑包?
试图以这种方式获得 ServiceReference 会让自己陷入灾难。此代码无法处理 OSGi 中 99% 的情况:配置管理员可能不存在,配置管理包在您之后启动,配置管理包处于另一个启动级别,配置管理包已停止,并且配置管理员已更新。核心 OSGi API 非常强大,被许多中间件使用,但不应该用于应用程序代码,因为它需要对底层模型的深入了解并且非常容易出错。
到目前为止,最简单、最可靠的解决方案是使用带有注释的声明式服务 (DS):
@Component
public class MyClass implements MyService {
ConfigurationAdmin ca;
@Reference void setCA(ConfigurationAdmin ca) { this.ca = ca; }
public void doMyService() {
// ... you can safely use ca
}
}
Gunnar 可能是对的,可能一开始就没有安装配置管理服务。但是,使用您当前的代码段,您的代码无论如何都会在另一个时间爆炸。
如果您运行 Equinox,请确保 Config Admin 包 (org.eclipse.equinox.cm) 已安装并启动。