更多 LDAP 操作

LDAP 类的其余部分介绍了 JNDI 如何提供执行某些有趣的 LDAP 操作的能力。

Renaming Objects

您使用Context.rename()重命名目录中的对象。在LDAP v2中,这对应于“ modify RDN”操作,该操作重命名了同一上下文中的条目(即,重命名同级)。在LDAP v3中,这与“修改 DN”操作相对应,类似于“修改 RDN”,只是新旧条目不必位于同一上下文中。您可以使用Context\.rename\(\)重命名叶子条目或内部节点。 命名和目录操作类中显示的示例重命名了叶子条目。以下code将内部节点从"ou=NewHires"重命名为"ou=OldHires"

ctx.rename("ou=NewHires", "ou=OldHires");

Note:

Oracle 目录服务器 v5.2不支持重命名内部节点。如果运行此示例,则将获得ContextNotEmptyException

重命名为 DIT 的其他部分

使用 LDAP v3,您可以将条目重命名为 DIT 的其他部分。为此,必须使用Context\.rename\(\),并且新旧条目都必须使用共同的祖先上下文。例如,要将"cn=C\. User, ou=NewHires, o=JNDITutorial"重命名为"cn=C\. User, ou=People, o=JNDITutorial",必须使用"o=JNDITutorial"命名的上下文。以下是an example演示了这一点。如果try在 LDAP v2 服务器上运行此示例,则将获得InvalidNameException,因为版本 2 不支持此功能。

ctx.rename("cn=C. User, ou=NewHires", "cn=C. User, ou=People");

Note:

Oracle 目录服务器 v5.2不支持使用不同的父节点重命名。如果使用该服务器运行此示例,则将获得OperationNotSupportedException(指示“协议错误”)。

保留旧名称属性

在 LDAP 中,重命名条目时,可以选择保留条 Object 旧 RDN 作为更新条 Object 属性。例如,如果将条目"cn=C\. User"重命名为"cn=Claude User",则可以指定是否要将旧 RDN "cn=C\. User"保留为属性。

若要指定在使用Context\.rename\(\)时是否要保留旧名称属性,请使用"java\.naming\.ldap\.deleteRDN"环境属性。如果此属性的值为"true"(默认值),则将删除旧的 RDN。如果其值为"false",则将旧的 RDN 保留为已更新条 Object 属性。完整的示例是here

// Set the property to keep RDN
env.put("java.naming.ldap.deleteRDN", "false");

// Create the initial context
DirContext ctx = new InitialDirContext(env);

// Perform the rename
ctx.rename("cn=C. User, ou=NewHires", "cn=Claude User,ou=NewHires");