如何使用Spring LDAP 2.0 ODM处理OrganizationalUnit?

时间:2014-11-26 10:03:14

标签: java spring-ldap

我正在迁移管理OpenLDAP对象的LDAP客户端应用程序。此应用程序是用Java编写的,目前使用的是spring ldap 1.3。 我目前(70%)正在迁移到spring ldap 2.0.2,我对这个新版本非常满意。

我已经创建了我们的对象并使用了注释(@Entry ...)并且它有效。

现在这是我的问题:

  • 我的用户位于ou = people,dc = mycompany,dc = com
  • 用户属于单位
  • 单位的基本名称是ou = units,dc = mycompany,dc = com
  • 单位是分层嵌入的:ou = a,ou = b,ou = units或ou = e,ou = b,ou = units

这是我的代码:

@Entry(objectClasses={"organizationalUnit", "top"}, base="ou=units")
public class Unit {

    @Id
    private Name dn;

    @Attribute(name="ou")
    @DnAttribute(value="ou", index=1)
    private String rdn;
}

但此代码仅适用于第一级单位! 我发现以下question和@marthursson建议编写自己的ObjectDirectoryMapper。这是唯一的解决方案吗?

编辑1:你的意思是,像:

@Entry(objectClasses={"organizationalUnit", "top"}, base="ou=units")
public class Unit {

    @Id
    private Name dn;

    @Attribute(name="ou")
    @DnAttribute(value="ou", index=1)
    private String rdn;

    @Attribute(name="ou")
    @DnAttribute(value="ou", index=2)
    private String lvl2;

    @Attribute(name="ou")
    @DnAttribute(value="ou", index=3)
    private String lvl3;

    @Attribute(name="ou")
    @DnAttribute(value="ou", index=4)
    private String lvl4;
}

如果没有值放在索引2,我会得到一个IndexOutofBoundException。通常情况下,当我在ou = units下加载根单元时。

编辑2:以下功能完成工作:

public String getRdn() {
    LdapName n = LdapNameBuilder.newInstance(dn.getSuffix(dn.size()-1)).build();
    return n.getRdn(0).getValue().toString();
}

0 个答案:

没有答案