2

当我在 osgi 中使用我的 Bundle 时,我需要 ServiceReference 和 Service Object。但是,当我按照下面的代码所示进行操作时,我的包不再能找到绑定方法。我究竟做错了什么?

public class AServiceImpl implements AService{

    TestService t;
    JournalService journalService;
    BundleContext context;
    ServiceReference testServiceRef;

    public void bindTestService(TestService testService, ServiceReference sv) {
        t = testService;
            testServiceRef = sv;
        //this.testServiceRef = testServiceRef;
        test.api.TestStaticVariable.getUniqueInstance().add("TEST A");
        System.out.println(test.api.TestStaticVariable.getUniqueInstance().toString());
    }

    public void unbindTestService(TestService testService){
        System.out.println("");
        if(t.equals(testService)){
            t = null;
        }
    }

    public void bindJournalService(JournalService journalService){
        this.journalService = journalService;  
    }

    public void unbindJournalService(JournalService journalService){
        if(this.journalService.equals(journalService)){
            this.journalService = null;
        }
    }   
}
4

3 回答 3

3

请参阅https://osgi.org/download/r4v43/osgi.cmpn-4.3.0.pdf上 OSGi 纲要 4.3 的第 112.3.2 节。

所以只需使用ServiceReference112.3.2 中描述的通过组件上下文获取对象。

于 2013-07-23T14:54:28.723 回答
0

我找到了一个合适的解决问题的方法:

我只是使用从激活方法中检索到的 BundleContext。在那里,我使用以下方法:

testServiceRef = context.getServiceReference(TestService.class);

其中 TestService 是从 bind 方法中检索的。

于 2013-07-23T15:14:05.503 回答
0

您可以使用FrameworkUtil#getBundle简单地获取任何类的包,从中可以获取BundleContext。然后,您可以从 BundleContext 获取ServiceReference,使用它您最终可以从 BundleContext API获取服务实例。

    import org.apache.sling.api.resource.ResourceResolverFactory;
    import org.osgi.framework.Bundle;
    import org.osgi.framework.BundleContext;
    import org.osgi.framework.FrameworkUtil;
    import org.osgi.framework.ServiceReference;

    public class GetServiceDemo {

        public static ResourceResolverFactory getResourceResolverFactory(){
            Bundle bundle = FrameworkUtil.getBundle(ResourceResolverFactory.class);
            BundleContext bundleContext = bundle.getBundleContext();
            ServiceReference<ResourceResolverFactory> resourceResolverFactoryServiceReference = bundleContext.getServiceReference(ResourceResolverFactory.class);
            ResourceResolverFactory resourceResolverFactory = bundleContext.getService(resourceResolverFactoryServiceReference);
            return resourceResolverFactory;
        }
    }

ResourceResolverFactory 是一个注册服务。

于 2019-11-17T17:32:30.743 回答