使用多个属性定义OSGi DS参考过滤器

时间:2017-12-21 17:55:41

标签: java osgi apache-felix

我的问题很简单,是否可以基于多个属性创建一个@Reference过滤器?如果是这样,语法是什么?

对于后台,我的服务如下:

@Component (property = {"myProp1=foo", "myProp2=bar"}
public class MyService implements IMyService
...

使用IMyService的东西只需要myProp1 = foo和myProp2 = bar。我尝试了各种语法形式,但还没有找到一种有效的语法形式。

private @Reference (target = "(myProp1=foo)(myProp2=bar)" IMyService svc;

上面确实解决了,我得到了一个引用,但是记录了一个错误,“依赖的目标属性中的语法无效......”。因此即使它有效,它似乎也是一种侥幸,因为语法存在一些问题。

private @Reference (target = "((myProp1=foo)(myProp2=bar))" IMyService svc;
private @Reference (target = "((myProp1=foo) (myProp2=bar))" IMyService svc;
private @Reference (target = "((myProp1=foo), (myProp2=bar))" IMyService svc;
private @Reference (target = "{(myProp1=foo), (myProp2=bar)}" IMyService svc;
private @Reference (target = "[(myProp1=foo), (myProp2=bar)]" IMyService svc;

以上都没有编译好的验证。

private @Reference (target = "([myProp1=foo, myProp2=bar])" IMyService svc;
private @Reference (target = "(myProp1=foo, myProp2=bar)" IMyService svc;

以上编译但只是不返回服务。

private @Reference (target = "(myProp1=foo)" IMyService svc;

如上所示对单个字段进行过滤效果很好但不是我想要的完整解决方案。

javadoc for the @Reference annotation没有提供有关如何使用“目标”参数的任何指导。

1 个答案:

答案 0 :(得分:2)

当然可以,过滤器格式为< ldap样式'。和运算符是'&',您可以在子表达式之前使用它。

在你的情况下,它会是这样的:

(&(myProp1=foo)(myProp2=bar))

供参考: https://osgi.org/javadoc/r2/org/osgi/framework/Filter.html