Java/LDAP:getAttribute(“cn”)返回null
在用Java编写的LDAP中搜索之后,我得到了一个有效的条目Java/LDAP:getAttribute(“cn”)返回null,java,ldap,Java,Ldap,在用Java编写的LDAP中搜索之后,我得到了一个有效的条目 cn=DE9-M5T,ou=students,ou=users,o=data 当我现在这样做的时候 if (entry != null && entry.getAttribute("modifyTimestamp") != null) { String dn = entry.getDN(); String modifyTimestamp = entry.getAttribute("
cn=DE9-M5T,ou=students,ou=users,o=data
当我现在这样做的时候
if (entry != null && entry.getAttribute("modifyTimestamp") != null) {
String dn = entry.getDN();
String modifyTimestamp = entry.getAttribute("modifyTimestamp").getStringValue();
String oldTimestamp = modificationTimestampCache.get(dn);
String cnUserId = entry.getAttribute("cn").getStringValue();
...
}
最后一行给出了一个NullPointerException,这意味着
entry.getAttribute("cn")
必须返回
null
。在文档之后,只有在给定属性(此处为“cn”)无法找到精确匹配时,才会发生这种情况。在LDAP?< /P> < P>中,有什么原因会发生这样的代码:“Cd>CN”/代码>?我不能从您的代码中找出您的条目及其GETAtQuestor()的确切类型,但请考虑如下:
cn
是一个多值ldap属性,其中modifytimestamp
是单值的
因此,
cn
的值可能存储在类似数组的结构中,我猜您的getAttribute()并没有像您预期的那样处理这个问题。不是每个对象类都有cn
属性。只有在模式中出现的那些
显然这不是其中之一。您能调试它吗?我假设entry.getAttribute(“modifyTimestamp”)返回的条目比您想要的要多,因为它没有cn。我建议您拆分这行字符串cnUserId=entry.getAttribute(“cn”).getStringValue();输入2并添加空检查。如果为空,则继续;我无法调试它,但向主机发送了一个版本,其中包含entry.getAttribute(“cn”)的null检查;注意空指针异常是针对“cn”而不是“modifyTimestamp”的行提出的(我这么说了:最后一行给出了…),我的意思是条目通过了modifyTimestamp的if语句,但这并不意味着它确实具有“cn”属性。更改“if”以检查“cn”属性,如下所示:
if(entry!=null&&entry.getAttribute(“modifyTimestamp”)!=null&&entry.getAttribute(“cn”)!=null)
如果有效,我会将其发布为答案,如果您愿意接受,我将不胜感激。因此您猜测getAttribute()
如果是多值属性,是否返回null?那到底有什么用呢?在Javadoc中它在哪里这么说?检查类LDAPAttributeSet和方法getAttribute(),检查原因?它不支持你的观点。它说的是,我逐字引用,“在这两种情况下,如果没有与指定的attrName
完全匹配,则返回null
”。多值属性完全没有任何意义。我只是建议多值cn可能是问题,因为我不知道使用了哪些java类。顺便说一下,cn是dn中的命名属性。所以你不会期望它丢失。这正是你所建议的。你的回答没有任何其他内容,你对我的评论也没有回应。顺便说一下,并不是所有的对象类都有cn
属性,正如我不久前在自己的回答中所说的那样<代码>组织单元只是众多示例中的一个。