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

问题描述 投票:1回答:1

我的问题很简单,是否可以基于多个属性创建一个@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没有提供有关如何使用“目标”参数的任何指导。

java osgi apache-felix
1个回答
2
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.