OSGi - 按名称(id)获取 ds 服务

3 java osgi declarative-services jakarta-ee

我是 OSGi 的新手。我用谷歌搜索了大约几个小时,但找不到答案。也许我的理解是错误的。所以问题来了。假设我有一个组件。

<component name="sample.component" immediate="true">
  <implementation class="sample.SampleComparator" />
  <service>
    <provide interface="java.util.Comparator" />
  </service>
</component>
Run Code Online (Sandbox Code Playgroud)

并在代码中:

ServiceReference[] serviceReferences = 
    bundleContext.getServiceReferences(
        java.util.Comparator.class.getName(), "(name=sample.component)");
Run Code Online (Sandbox Code Playgroud)

但我明白了null。错误在哪里?过滤器是否(name=sample.component)正确?或者我如何设置服务的 id 并通过它进行查找?

Bal*_*dos 6

服务属性的名称是“component.name”,而不是“name”。

如果你这样做,它会起作用:

getServiceReferences(java.util.Comparator.class.getName(),"(component.name=sample.component)");
Run Code Online (Sandbox Code Playgroud)

  • 最好使用 service.pid,因为即使您以基于配置多次实例化组件的方式创建组件(请参阅configurationFactory=true),它也是唯一的。service.pid 是一个持久的 id,重启后将保持不变。对 service.pid 的过滤也应该来自持久配置(请参阅组件配置中的referenceName.target) (2认同)