ldap事件筛选器

63lcw9qa  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(372)

我的事件属性中有一个元素可以为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=*)) ,但它不起作用。

gdx19jrr

gdx19jrr1#

万一有人有类似的问题,我现在就这样解决。
我添加了第二个属性来保存 null 值存在:

List<String> values = //...
 eventProperties.put("myProperty", values);
 eventProperties.put("myProperty.hasNull", values.contains(null));

所以我可以使用这个新属性进行查询:

serviceProperties.put(EventConstants.EVENT_FILTER, 
        value == null ? "(myProperty.hasNull=true)" : "(myProperty=" + value + ")");

它并不完美,但它确实起作用。

mutmk8jj

mutmk8jj2#

使用类似于以下内容的过滤器可能会取得一些成功:

(myProperty=\00)

“\00”是null的转义序列。其中一些取决于值中是否只有“null”。我们遇到过这样的情况:来自sql数据存储的值将以空值结束,并且能够使用该过滤器。
如果“null”在属性值内(比如tom<“null”>smith),我只知道将属性值作为二进制读取并解析字符来查找“null”。
-吉姆

jgzswidk

jgzswidk3#

ldap筛选器表达式 (myProperty=*) 如果设置了属性,则计算结果为true,否则为false。在ldap filter表达式中无法测试空值。如果event属性有空值,我建议不要设置它。

相关问题