Решением для меня было реализовать пользовательский DirContextProcessor , который позволял мне сортировать по нескольким атрибутам с желаемым направлением (восходящим / нисходящим), используя метод перегрузки SortControl класс, который принимает массив SortKey s объектов в качестве параметра.
Реализация должна расширять AbstractFallbackRequestAndResponseControlDirContextProcessor и переопределять createRequestControl метод.
Суперкласс AbstractFallbackRequestAndResponseControlDirContextProcessor позаботится о фактическом создании элемента управления.Он ожидает только 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);