Сортировка по убыванию LDAP с Spring Boot - PullRequest
0 голосов
/ 29 января 2019

Можно ли сортировать записи из каталога LDAP с помощью SortControlDirContextProcessor по убыванию, а не по возрастанию?

I на основе этого: SpringLdap - LdapTemplateSortedSearchITest

public void testSearch_SortControl_ConvenienceMethod() {
    SortControlDirContextProcessor requestControl;

    // Prepare for first search
    requestControl = new SortControlDirContextProcessor("cn");
    tested.search(BASE, FILTER_STRING, searchControls, callbackHandler,
            requestControl);
    int resultCode = requestControl.getResultCode();
    boolean sorted = requestControl.isSorted();
    assertThat("Search result should have been sorted: " + resultCode, sorted).isTrue();
    List list = callbackHandler.getList();
    assertSortedList(list);
}

Это работаетно по возрастанию.Как установить сортировку по убыванию?

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Решением для меня было реализовать пользовательский DirContextProcessor , который позволял мне сортировать по нескольким атрибутам с желаемым направлением (восходящим / нисходящим), используя метод перегрузки SortControl класс, который принимает массив SortKey s объектов в качестве параметра.

Реализация должна расширять AbstractFallbackRequestAndResponseControlDirContextProcessor и переопределять createRequestControl метод.

Суперкласс AbstractFallbackRequestAndResponseControlDirContextProcessor позаботится о фактическом создании элемента управления.Он ожидает только 2 фрагмента информации от подкласса.

  1. Полное имя класса элемента управления для создания экземпляра
  2. Типы и значения параметров конструктора

Полное имя класса указывается в свойстве подкласса defaultRequestControl , а типы и значения параметров конструктора предоставляются в методе подкласса createRequestControl .

Информация о направлении сортировки для любого конкретного атрибута предоставляется в свойстве ascendingOrder объекта SortKey .

public class SortMultipleControlDirContextProcessor extends AbstractFallbackRequestAndResponseControlDirContextProcessor{

    private SortKey[] sortKeys;
    private boolean sorted;
    private int resultCode;

    public SortMultipleControlDirContextProcessor(SortKey ... sortKeys){

        if(ArrayUtils.isEmpty(sortKeys)){
            throw new IllegalArgumentException("At least one key to sort on must be provided.");
        }

        this.sortKeys = sortKeys;
        this.sorted = false;
        this.resultCode = -1;
        this.defaultRequestControl = "javax.naming.ldap.SortControl";
        this.defaultResponseControl = "javax.naming.ldap.SortResponseControl";
        this.fallbackRequestControl = "com.sun.jndi.ldap.ctl.SortControl";
        this.fallbackResponseControl = "com.sun.jndi.ldap.ctl.SortResponseControl";

        loadControlClasses();
    }

    @Override
    public Control createRequestControl(){
        return super.createRequestControl(new Class[]{SortKey[].class,  boolean.class}, new Object[]{sortKeys, critical});
    }

    @Override
    protected void handleResponse(Object control) {

        Boolean result = (Boolean) invokeMethod("isSorted", responseControlClass, control);
        this.sorted = result;

        Integer code = (Integer) invokeMethod("getResultCode", responseControlClass, control);
        this.resultCode = code;
    }

    public SortKey[] getSortKeys(){
        return sortKeys;
    }

    public boolean isSorted(){
        return sorted;
    }

    public int getResultCode(){
        return resultCode;
    }
}

После реализации вы можете использоватькласс для сортировки результатов по нескольким атрибутам в любом желаемом направлении:

// SortKey for sorting results on the cn attribute in descending order
SortKey cnSortKey = new SortKey("cn", false, null);

// Instantiate the control
SortMultipleControlDirContextProcessor myCustomControl = new SortMultipleControlDirContextProcessor(cnSortKey);

// Perform the search with the control
List<User> users = ldapTemplate.search("", orFilter.encode(), searchControls, new UserAttributesMapper(), myCustomControl);
0 голосов
/ 29 января 2019

Полагаю, это может быть полезно:

public SortKey (String attrID, boolean ascendingOrder, String matchRuleID)

Создает ключ сортировки для атрибута.Записи будут отсортированы в соответствии с указанным атрибутом в указанном порядке сортировки и с использованием указанного правила сопоставления, если оно предоставлено.

Параметры: attrID - ненулевое значениеИдентификатор атрибута, который будет использоваться в качестве ключа сортировки.


ascendingOrder - Если true, то записи располагаются в порядке возрастания.В противном случае они располагаются в порядке убывания.


matchRuleID - возможно нулевой идентификатор правила сопоставления, который будет использоваться для упорядочения значений атрибута.Если не указано иное, используется правило сопоставления порядка, определенное для атрибута ключа сортировки.

Оно из документов: Документация Java

Относительно вашего вопроса: Примеркод из java doc

И я нашел еще одну альтернативу под названием unboundid ldap sdk link

...