在OSGI组件声明中使用属性

时间:2017-07-12 09:02:19

标签: liferay osgi liferay-7

在我的模块中,在OSGI组件声明中我需要使用一个属性,该属性将在我的portal-ext.properties中,如下所示:

open class Foo 
{
    internal required init() // error
}

但是我得到了编译错误:“注释属性Component.property的值必须是常量表达式”。我该怎么办才能在这里使用房产?

2 个答案:

答案 0 :(得分:2)

  

但是我得到了编译错误:"注释属性Component.property的值必须是常量表达式"。我该怎么办才能在这里使用房产?

条目:

@Component(configurationPid="foo")

是问题所在。这是因为注释只能具有编译时常量的值。显然,这个属性不是编译时常量,因为它的值取决于调用方法。

如果要在运行时提供属性值,则可以使用Configuration Admin在OSGi中执行此操作。默认情况下,所有声明性服务组件都是可配置的,使用pid:

  • 通过设置@Component(name="bar")
  • 配置用户
  • 通过设置@Activate
  • 配置用户
  • 使用组件实现的完全限定类名默认

当您向Configuration Admin提供与DS组件的pid匹配的配置字典时,它将绑定到该组件。

  1. 您的组件属性将与配置字典合并(配置会覆盖静态属性)。您的组件可以使用@Modified方法
  2. 接收此信息
  3. 如果您的组件已注册为服务,那么您的服务属性也将更新。
  4. 如果您的组件具有@Component(configurationPolicy=ConfigurationPolicy.REQUIRE) 方法,则这些更改将是动态的,否则您的组件实例将被停用并被丢弃,并且会创建并激活新实例。
  5. 通过设置组件的配置策略,可以强制组件在激活配置之前不激活。当您拥有需要存在的属性但在运行时才能知道该属性时,这非常有用。

    Intent[] intents = new Intent[2];
        Intent intent1 = new Intent(this, MainActivity.class);
        Intent intent2 = new Intent(this, YourActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivities(this, 0, intents,PendingIntent.FLAG_ONE_SHOT);
    

答案 1 :(得分:1)

您可以使用配置管理配置设置任何这些属性。 因此,一种方法是使用单独的组件为该组件编写配置。

您可以使用configurationPolicy = ConfigurationPolicy.REQUIRE来阻止在此配置出现之前激活组件。

另一种方法是使用组件工厂。请参阅this blog from Scott