首页 > 解决方案 > 不支持的类型 java.util.concurrent.atomic.AtomicReference

问题描述

我正在编写 OSGI 服务。启动服务后,我收到以下消息。请建议克服此问题。

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

@Reference (name = "CounterService", policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MANDATORY,
            bind = "bindCounter", unbind = "unbindCounter", service = CounterService.class)
    public static final AtomicReference<CounterService> myCounterService = new AtomicReference<>();

public void bindCService(CounterService counterService)
{     
    this.cacheService= cacheService;
}

public void unbindService(CounterService cacheService)
{     
    this.cacheService= null;
}

}

我在启动服务后收到了这条消息

-!MESSAGE [com.xxx.xxx.xxx.CounterImpl(29)] 组件类 com.xxx.xxx.xxx.CounterImpl 中的字段 counterService 具有不受支持的类型 java.util.concurrent.atomic.AtomicReference

标签: javaosgiosgi-bundledeclarative-services

解决方案


那么,为什么是 AtomicReference?您也不需要绑定和取消绑定服务。你似乎很困惑 :-) 你可能想看看视频OSGi 启动器

对于动态情况,这是可行的:

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

    @Reference    
    volatile CounterService myCounterService;
    
    @Activate
   void activate() {
    ...
    }
    
}

如果CounterService不是动态的,这是一个非常好的模式:

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

    final CounterService myCounterService;
    
    @Activate
    public ServiceImpl( @Reference  CounterService  c ) {
        this.myCounterService = c;
    }
    
}

推荐阅读