используя @LDAPGetter и @LDAPSetter UnboundID - PullRequest
2 голосов
/ 13 января 2011

У кого-нибудь есть базовый пример использования этих двух аннотаций из SDK UnboundID для сохранения объектов в каталоге LDAP? Кажется, я не могу найти информацию о типе аргумента метода @LDAPSetter или значении, возвращенном методом @LDAPGetter.

Другими словами, как мне заполнить поля <?>:

/**
* 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();
}

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Это действительно зависит от значения атрибута roleOccupants. Одним из необязательных полей аннотаций @LDAPGetter и @LDAPSetter является encoderClass, что позволяет указать кодировщик объекта, который будет использоваться для преобразования между значениями атрибутов LDAP и типами данных Java. Если вы не укажете пользовательский кодировщик (и в большинстве случаев вам это не нужно), он будет использовать класс DefaultObjectEncoder для выполнения работы и поддерживает следующие типы данных:

  • булево
  • байт []
  • символ []
  • двойной
  • поплавок
  • INT
  • длинный
  • короткий
  • 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.Date
  • 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. Во многих случаях String может быть наиболее подходящим, но в других вы скорее можете рассматривать его как число, или DN, или как метку времени, или что-то в этом роде. Если ни один из типов по умолчанию не является приемлемым, вы можете создать свой собственный экземпляр ObjectEncoder для выполнения любого перевода, который вы хотите.

2 голосов
/ 14 января 2011

Вот пример использования для всех, кому интересно.Он автоматически загружает пользовательские данные из ldap при чтении 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);
    }
...