如何在 OSGI 声明式服务中使用 @Property 注解的基数

问题描述

我正在将 Apache Felix SCR 注释迁移到 Osgi 声明式服务 [AEM]。在迁移时,我找不到 DS 中基数的确切替代品。

现有的 SCR 实施:

@Component (ds = true,immediate = true,Metatype = false,policy = ConfigurationPolicy.OPTIONAL)
@Service (SampleService.class)
public class SampleServiceImpl implements SampleService
{
   private static final int VECTOR = Integer.MIN_VALUE + 1;

    @Property (value = REPOSTING_PATTERN,cardinality = VECTOR,description = "Event reposting pattern for QueuePosting ")
    private static String EVENT_REPOSTING_PATTERN = "eventRepostingPattern";
}

现在在 Osgi 声明式服务中迁移如下

  @Component (configurationPolicy = ConfigurationPolicy.OPTIONAL,service =SampleService.class,property = {SampleServiceImpl .EVENT_REPOSTING_PATTERN +"="+SampleServiceImpl .EVENT_REPOSTING_PATTERN_VALUE })
  public class SampleServiceImpl implements SampleService
   {
     private static String EVENT_REPOSTING_PATTERN = "eventRepostingPattern";
     private static String EVENT_REPOSTING_PATTERN = "eventRepostingPatternValue";
   }

在 DS 注释实现中,我必须如何映射@Property 中存在的参数 cardinality。请建议我

解决方法

Documentation 关于 @Propertycardinality 像往常一样令人困惑,但我基于 this 假设这些在某种程度上与配置有关。您可以使用 @Designate@ObjectClassDefinition 注释为您的服务设置类型安全配置。 cardinality 选项可以在 @AttributeDefinition 注释中找到。

ExampleServiceimpl.java

import org.osgi.framework.BundleContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.metatype.annotations.Designate;

@Component( immediate = true,service = ExampleService.class )
@Designate( ocd = ExampleServiceConfig.class )
public class ExampleServiceImpl implements ExampleService {
    
    @Activate
    public void activateService(BundleContext context,ExampleServiceConfig config){
        System.out.println(config.some_config());
    }
}

ExampleServiceConfig.java

import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;

@ObjectClassDefinition(
    name = " Example service Configuration"
)
public @interface ExampleServiceConfig {
    
    @AttributeDefinition( cardinality = 1 )
    String some_config() default "default value";
}

现在作为免责声明,我自己从未设法使用过 @AttributeDefinitioncardinality 注释,因此可能会在这里关闭。我在尝试使用 cardinality 时遇到了 @AttributeDefinition 选项,以查看是否可以使用它在 hawtio 中使我的服务配置更漂亮,但可能遗漏了一些步骤。

但希望这会为您指明正确的方向。