【发布时间】:2020-07-20 15:26:32
【问题描述】:
在我的项目中,我有一个 OSGI 包。在这个包中,我有一个 Activated 方法和一个 bind(to ConfigurationAdmin) 方法。
当我第一次运行项目时,首先调用 Activated 方法,因此我可以初始化我需要的所有东西,但是如果我停止捆绑然后再次启动它,首先调用绑定方法并且我有一个nullpointer(因为尚未调用 Activate 中的初始化)。
绑定方法处的引用是“cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC”
为什么第二次开始的时候顺序变了?
@Component(configurationPid = "ConsulService", immediate = true, service = ConsulService.class)
public class ConsulServiceImpl implements ConsulService {
private ConfigurationAdmin configurationAdmin;
private BundleContext context;
private Consul consul;
@Override
public AgentClient agentClient() {
return consul.agentClient();
}
@Override
public KeyValueClient keyValueAgent() {
return consul.keyValueClient();
}
@Activate
public void activate(BundleContext bundleContext) {
//this cause the nullpointer after the stop and the restarting of this bundle
//since this method is not called "consul" is null
this.consul = Consul.builder().build();
this.context = bundleContext;
}
...
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, unbind = "unbindConfigurationAdmin")
public void bindConfigurationAdmin(final ConfigurationAdmin configurationAdmin) {
this.configurationAdmin = configurationAdmin;
// Here I have nullpointer because consul is not initializated
KeyValueClient keyValueAgent = keyValueAgent();
...
}
【问题讨论】:
-
你停止了什么捆绑?包含您的组件的捆绑包还是托管您绑定到的服务的捆绑包?
-
嗨,Christian,我停止使用我的组件进行捆绑。 ConfigurationAdmin 是 OSGI 的一项服务
-
那听起来很奇怪..你能显示组件的相关代码吗?
-
我已经用代码编辑了我的问题