在我的项目中,我有一个OSGI捆绑包。在此捆绑软件中,我有一个Activated方法和一个bind(to ConfigurationAdmin)方法。
当我第一次运行项目时,首先调用了Activated方法,因此我可以初始化我需要的所有东西,但是如果我停止捆绑软件然后再次启动它,则首先调用bind方法,并且nullpointer(因为尚未调用Activate中的初始化)。
bind方法的引用为“基数= ReferenceCardinality.OPTIONAL,策略= 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();
...
}
答案 0 :(得分:1)
绑定方法可以在Activate方法之前称为。实际上,对于静态引用,绑定方法 必须在Activate方法之前被调用。将激活方法视为后构造方法。如果您需要Activate方法作为构造函数,请使用DS 1.4支持的构造函数注入。
答案 1 :(得分:0)
似乎在服务可用时将调用绑定方法。 第一次启动时,调用Activated方法的configurationAdmin尚不可用,但是当我停止捆绑软件然后再次重新启动它时,configurationAdmin是可用的,并且绑定在激活之前被调用。