Я нигде не нашел, можно ли вручную создавать страницы из строки, допустим, что у нас есть следующий метод обслуживания
public <T> List<T> findAnything(final int page, final int size, final String sort) { // e.g. id,desc&username,asc
final Pageable pageable = new PageRequest(page, size, null);
return null;
}
мой вопрос в том, как я могу создать объект
org.springframework.data.domain.Sort
из заданной строки формата, важно отметить, что эти параметры изменяются динамически, поэтому, скорее всего, мне нужен путь к синтаксическому анализатору Spring, в моем примере я передаю null вместо объекта
id,desc&username,asc
РЕДАКТИРОВАТЬ
Немного подробнее Я ищу механизм того, как spring преобразует строку 'sort' (с остальными параметрами по умолчанию), которая поступает в конечную точку отдыха в качестве параметра запроса к объекту Pageable
спасибо, в моем случае эти параметры представлены как id, desc и username, asc string, обновлен формат, извините за путаницу




Ты можешь сделать :
private Sort orderBy() {
return new Sort(Sort.Direction.DESC, "ID")
.and(new Sort(Sort.Direction.ASC, "username"));
}
Я думаю это полезно
Класс сортировки имеет статический вложенный класс Порядок:
public static class Order{
private final Direction direction;
private final String property;
private final boolean ignoreCase;
private final NullHandling nullHandling;
}
а затем вы можете использовать:
public static Sort by(List<Order> orders)
где вы создаете свой заказ из строки, как простое разделение.
эти параметры меняются динамически, как вы можете видеть из сигнатуры метода, так что на самом деле это не то, что я ищу
Этот ответ на самом деле дает вам все, что вам нужно. Вы точно знаете, как передать параметр String методу. Ну тогда передайте это в метод orderBy.
похоже, ты не совсем понимаешь проблему
Вы можете преобразовать свою строку в карту, а затем заполнить ее из элементов сортировки карты Map <String, Sort.Direction>, где id будет именем столбца и порядком значений
хорошо, теперь вы поняли проблему, может быть, есть метод по умолчанию, который Spring использует для того же, конечно, я могу написать его вручную, но я не могу поверить, что он никогда не был раскрыт
если вы имеете в виду решение выше, я не думаю, что спрашивал, как передать параметры конструктору :)
@MykhailoMoskura Теперь это имеет больше смысла. Учитывая, что формат id,desc,username,asc нестандартен, сборка List<Order> - хороший вариант. Собственно, этим и занимается SortHandlerMethodArgumentResolver. Проголосовали.
@ Андрей Тобилко, спасибо
спасибо, ребята, SortHandlerMethodArgumentResolver действительно делает это, но его метод parseParameterIntoSort для анализа аргументов имеет доступ к частному пакету по некоторым скрытым причинам, спасибо принято !!!!
Для этой цели я написал что-то похожее на то, что есть у Spring, я был бы счастлив, если бы Spring предоставил SortHandlerMethodArgumentResolver.parseParameterIntoSort для использования вне пакета, но пока это не так.
private Sort parseMultipleSortQueries(final String query) {
final String[] queries = query.split("&");
return parseSortQuery(queries, ",");
}
private Sort parseSortQuery(final String[] query, String delimiter) {
final List<Sort.Order> orders = new ArrayList<>();
for (String q : query) {
if (q == null) {
continue;
}
final String[] parts = q.split(delimiter);
final Sort.Direction direction = parts.length == 0 ? null : Sort.Direction.fromStringOrNull(parts[parts.length - 1]);
for (int i = 0; i < parts.length; i++) {
if (i == parts.length - 1 && direction != null) {
continue;
}
final String property = parts[i];
if (!StringUtils.hasText(property)) {
continue;
}
orders.add(new Sort.Order(direction, property));
}
}
return orders.isEmpty() ? null : new Sort(orders);
}
и вот тест
@Test
public void testParseQuery() {
System.out.println(parseMultipleSortQueries("firstName,asc&lastName,desc")); //firstName: ASC,lastName: DESC
}
что означает данный формат?
id,desc,username,ascВозможно, вы имели в видуsort=id,desc&sort=username,asc? Так Spring распознает объектSort