我的事件属性中有一个元素可以为null的列表。我想创建一个ldap字符串来匹配空元素。
考虑以下工作示例:
private final BundleContext context = FrameworkUtil.getBundle(LdapTest.class).getBundleContext();
private final EventAdmin eventAdmin = this.context.getService(this.context.getServiceReference(EventAdmin.class));
@Test
public void test() throws Exception {
final String value = "test";
// register a listener
final Dictionary<String, Object> serviceProperties = new Hashtable<>();
serviceProperties.put(EventConstants.EVENT_TOPIC, new String[] { "myTopic" });
serviceProperties.put(EventConstants.EVENT_FILTER, "(myProperty=" + value + ")");
final boolean[] called = { false };
final ServiceRegistration<EventHandler> listener = this.context.
registerService(EventHandler.class, e -> called[0] = true, serviceProperties);
// fire event
Assert.assertFalse(called[0]);
final Map<String, Object> eventProperties = new HashMap<>();
eventProperties.put("myProperty", Arrays.asList(value));
this.eventAdmin.sendEvent(new Event("myTopic", eventProperties));
Assert.assertTrue(called[0]);
listener.unregister();
}
现在如果我开始 value = null
,什么是 EVENT_FILTER
要让考试重新开始吗?
“我试过了” (!myProperty=*)
“和” (!(myProperty=*))
,但它不起作用。
3条答案
按热度按时间gdx19jrr1#
万一有人有类似的问题,我现在就这样解决。
我添加了第二个属性来保存
null
值存在:所以我可以使用这个新属性进行查询:
它并不完美,但它确实起作用。
mutmk8jj2#
使用类似于以下内容的过滤器可能会取得一些成功:
“\00”是null的转义序列。其中一些取决于值中是否只有“null”。我们遇到过这样的情况:来自sql数据存储的值将以空值结束,并且能够使用该过滤器。
如果“null”在属性值内(比如tom<“null”>smith),我只知道将属性值作为二进制读取并解析字符来查找“null”。
-吉姆
jgzswidk3#
ldap筛选器表达式
(myProperty=*)
如果设置了属性,则计算结果为true,否则为false。在ldap filter表达式中无法测试空值。如果event属性有空值,我建议不要设置它。