2

有没有人有使用UnboundID 的 SDK中的这两个注释将对象持久保存在 LDAP 目录中的基本示例?我似乎找不到有关@LDAPSetter方法参数类型或方法返回值的任何信息@LDAPGetter

换句话说,我如何填写<?>s:

/**
* Called when creating a Java object from an LDAP entry.
*/
@LDAPSetter(attribute="roleOccupants")
void initMembers(<?> occupants) {
    throw new UnsupportedOperationException();
}

/**
* Called when turning a Java object into an LDAP entry.
*/
@LDAPGetter(attribute="roleOccupants")
<?> storeMembers() {
    throw new UnsupportedOperationException();
}
4

2 回答 2

3

这实际上取决于roleOccupants属性的值。@LDAPGetter@LDAPSetter注释的可选字段之一是encoderClass,它允许您指定将用于在 LDAP 属性值和 Java 数据类型之间进行转换的对象编码器。如果您不指定自定义编码器(并且大多数情况下您不需要),那么它将使用DefaultObjectEncoder该类来执行工作,并且它支持以下数据类型:

  • 布尔值
  • 字节[]
  • 字符[]
  • 双倍的
  • 漂浮
  • 整数
  • 短的
  • java.lang.Boolean
  • java.lang.Double
  • java.lang.Float
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Short
  • java.lang.String
  • java.lang.StringBuffer
  • java.lang.StringBuilder
  • java.math.BigDecimal
  • java.math.BigInteger
  • java.net.URI
  • java.net.URL
  • java.util.日期
  • java.util.UUID
  • java.util.concurrent.atomic.AtomicInteger
  • java.util.concurrent.atomic.AtomicLong
  • com.unboundid.ldap.sdk.DN
  • com.unboundid.ldap.sdk.Filter
  • com.unboundid.ldap.sdk.LDAPURL
  • com.unboundid.ldap.sdk.RDN

它还支持上述任何类型的数组、列表和集合,以及任何类型的枚举。请参阅com.unboundid.ldap.sdk.persist.DefaultObjectEncoder类的类级别文档,以更完整地描述支持的数据类型和 u 的任何约束。

所以实际上,您选择的数据类型取决于上述哪种类型最适合存储在相应 LDAP 属性中的信息类型。在许多情况下,字符串可能是最合适的,但在其他情况下,您可能更愿意将其视为数字或 DN 或时间戳或类似的东西。如果没有任何默认类型是可接受的,那么您可以创建自己的自定义 ObjectEncoder 实例来执行您想要的任何翻译。

于 2011-01-13T21:47:20.560 回答
2

这是其他任何想知道的人的用法示例。当您读取organizationalRole.

UserRole班级:

@LDAPObject(structuralClass="organizationalRole", defaultParentDN="dc=Roles,dc=example,dc=com")
public class UserRole extends LDAPModel implements models.deadbolt.Role {

    @LDAPField(attribute="cn",inRDN=true,filterUsage=FilterUsage.ALWAYS_ALLOWED)
    public String name;

    private List<User> members;

    public List<User> getMembers() {
        return members;
    }

    /**
    * Called when creating a Java object from an LDAP entry.
    */
    @LDAPSetter(attribute="roleOccupant")
    void initMembers(String[] occupants) throws LDAPException {
        members = new ArrayList<User>();

        if (occupants == null || occupants.length == 0)
            return;

        for (String dn : occupants)
            members.add(User.findByDN(dn));

    }

    /**
    * Called when turning a Java object into an LDAP entry.
    */
    @LDAPGetter(attribute="roleOccupant")
    String[] storeMembers() {
        if (members == null)
            return null;

        String[] member_strings = new String[members.size()];
        for (int i = 0; i < members.size(); i++)
            member_strings[i] = members.get(i).getDN();

        return member_strings;
    }

}

User班级:

@LDAPObject(structuralClass="inetOrgPerson",
    auxiliaryClass={"mozillaOrgPerson","posixAccount","sambaSamAccount","shadowAccount"},
    defaultParentDN="dc=People,dc=example,dc=com")
public class User extends LDAPModel implements RoleHolder {

    ...

    @LDAPField(attribute="givenName",filterUsage=FilterUsage.ALWAYS_ALLOWED)
    public String fname;

    @LDAPField(attribute="sn",filterUsage=FilterUsage.ALWAYS_ALLOWED)
    public String lname;

    public static User findByDN(String dn) throws LDAPException {
        LDAPConnection conn = ...
        LDAPPersister<User> persister = LDAPPersister.getInstance(User.class);
        return persister.get(dn, conn);
    }
于 2011-01-13T22:56:09.560 回答