Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LDAP&;Java:如何检查PagedResultsControl和/或VLV是否可用_Java_Active Directory_Ldap - Fatal编程技术网

LDAP&;Java:如何检查PagedResultsControl和/或VLV是否可用

LDAP&;Java:如何检查PagedResultsControl和/或VLV是否可用,java,active-directory,ldap,Java,Active Directory,Ldap,我需要为大型LDAP结果集实现分页,即按此处: 并非所有人都平等 此注释虽然很旧,但指出了一个事实,即不同的LDAP实现并不都支持此机制: Windows Active Directory服务器支持分页搜索控件。Oracle Directory Server 5.2版不支持它 最近的一篇文章显示Oracle Directory Server支持虚拟列表视图(vlv)的替代机制。 设计 对于实现,我想尝试一种机制,如果失败,则尝试另一种。(而不是如果AD这样做,如果Oracle这样做) 问题

我需要为大型LDAP结果集实现分页,即按此处:

并非所有人都平等

此注释虽然很旧,但指出了一个事实,即不同的LDAP实现并不都支持此机制:

Windows Active Directory服务器支持分页搜索控件。Oracle Directory Server 5.2版不支持它

最近的一篇文章显示Oracle Directory Server支持虚拟列表视图(vlv)的替代机制。

设计

对于实现,我想尝试一种机制,如果失败,则尝试另一种。(而不是如果AD这样做,如果Oracle这样做)

问题

在java中,如何检查当前LDAP/目录实例是否支持PagedControl或VLV?i、 e.我可以执行什么代码,我可以检查异常以了解它是否支持其中一个

谢谢

有两种方法

  • 尝试一下,并处理异常。这可能是最好的
  • 您可以查找根对象的
    supportedControl
    supportedExtension
    属性。VLV的OID为
    2.16.840.1.113730.3.4.9
    。分页结果控件的OID为
    1.2.840.113556.1.4.319。
    如果OID存在于
    supportControl
    属性中,则支持相应的功能

  • 为了基于user207421的答案,我能够使用以下方法执行选项2:

    private boolean isPagingSupported(DirContext dirContext)
            throws NamingException {
    
        Hashtable<?,?> environment = dirContext.getEnvironment();
        URI uri = URI.create("" +  environment.get("java.naming.provider.url"));
        final String rootDse = uri.getScheme() + "://" + uri.getAuthority();
    
        final Attributes attributes = dirContext.getAttributes(rootDse, new String[]{"supportedControl"});
    
        final NamingEnumeration attributeValues = attributes.getAll();
        while(attributeValues.hasMore()) {
            final Attribute attribute = (Attribute) attributeValues.next();
            final NamingEnumeration supportedControls = attribute.getAll();
            while(supportedControls.hasMore()) {
                String supportedControl = (String) supportedControls.next();
                if(supportedControl.equals(PAGING_OID)) {
                    return true;
                }
            }
        }
        return false;
    }
    
    进一步阅读:

    • 。请注意,本文档还提到检查
      2.16.840.1.113730.3.4.2
      ,这是不必要的

    您是否有要捕获的特定异常?i、 e.PagingNotSupportedException与一般LDAP异常。我实际上是在尝试编写“符合规范”的代码。我还担心,如果控件不受支持,不同的实现可能会引发不同的异常。我相信是javax.naming.OperationNotSupportedException,但您必须进行测试和验证。
      boolean pagingSupported = isPagingSupported(contextSource.getReadOnlyContext())