在 OSGI 的 Reference 对象中调用绑定方法后获取 Null 值

问题描述

在我的项目中,我有一个 Osgi 包。在这个包中,我有 osgi 引用和绑定和解除绑定方法。当我重新启动我的服务时,首先调用解除绑定方法,将引用对象设置为 null,然后调用绑定方法为引用对象设置值。

我的问题是在使用该引用对象时,它是 Null。因此抛出空指针异常。

在这里做错了什么?

@Component (service = Service.class,immediate = true)
public class ServiceImpl implements Service{

@Reference (name = "CacheService",policy = ReferencePolicy.DYNAMIC,cardinality = 
ReferenceCardinality.MANDATORY,bind = "bindCacheService",unbind = "unbindCacheService")
private CacheService cacheService;

public void bindCacheService(CacheService cacheService)
{     
    this.cacheService= cacheService;
}

public void unbindCacheService(CacheService cacheService)
{     
    this.cacheService= null;
}

public TransformationPojo  getMetadata() throws Exception
{
  
    LOGGER.debug("TransformerIMPL TransformationMetadata getMetadata invoked {}",cacheService);
    TransformationPojo transformationPojo = cacheService.getTransCache();
    return transformationPojo.getMetadata();
}

}

在运行此代码时,我从另一个调用 getMetadata() 时出现空指针异常。

2021-06-27T07:35:21.310+0200 | DEBUG | nt-Grouper-Task-10.216.200.229_6 | b.r.e.p.c.u.a.TransformerImpl | transformer.TransformerImpl  100 | 261 - com.common.utils.transformer - 1.30.0.SNAPSHOT | TransformerIMPL TransformationMetadata getMetadata invoked com.common.utils.cacheclient.Metadatapojo.TransformationMetadata@765bea96
2021-06-27T07:35:21.310+0200 | DEBUG | nt-Grouper-Task-10.216.200.229_6 | b.r.e.p.c.u.a.TransformerImpl | transformer.TransformerImpl  100 | 261 - com.common.utils.transformer - 1.30.0.SNAPSHOT | TransformerIMPL TransformationMetadata getMetadata invoked null
2021-06-27T07:35:21.311+0200 | ERROR | nt-Grouper-Task-10.216.200.229_6 | .p.c.i.p.g.i.EventGroupingWorker | ice.internal.EventGroupingWorker  162 | 257 - com.common.integration.processors.groupingservice - 1.30.0.SNAPSHOT | Exception in querying the data for grouping. skipping the current query.
java.lang.NullPointerException: null
at com.common.utils.transformer.TransformerImpl.getMetadata(TransformerImpl.java:101)

解决方法

Bound Service Replacement。使用动态策略时,在取消绑定方法删除旧服务之前,在绑定方法中注入新服务。所以如果在unbind方法中盲目的把字段设置为null,就会把之前注入的服务去掉。

,

经过多次尝试和错误方法后,我得到了此问题的解决方案。 如果将 CacheService cacheService 设为 static 则不会发生空指针异常。

@Reference (name = "CacheService",policy = ReferencePolicy.DYNAMIC,cardinality = 
ReferenceCardinality.MANDATORY,bind = "bindCacheService",unbind = "unbindCacheService")
private static CacheService cacheService;