Как вручную создать объект Pageable из строки

Я нигде не нашел, можно ли вручную создавать страницы из строки, допустим, что у нас есть следующий метод обслуживания

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 Возможно, вы имели в виду sort=id,desc&sort=username,asc? Так Spring распознает объект Sort

Andrew Tobilko 15.11.2018 15:47

спасибо, в моем случае эти параметры представлены как id, desc и username, asc string, обновлен формат, извините за путаницу

hdmiimdh 15.11.2018 16:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
4 918
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ты можешь сделать :

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)

где вы создаете свой заказ из строки, как простое разделение.

эти параметры меняются динамически, как вы можете видеть из сигнатуры метода, так что на самом деле это не то, что я ищу

hdmiimdh 15.11.2018 15:21

Этот ответ на самом деле дает вам все, что вам нужно. Вы точно знаете, как передать параметр String методу. Ну тогда передайте это в метод orderBy.

ygor 15.11.2018 15:23

похоже, ты не совсем понимаешь проблему

hdmiimdh 15.11.2018 15:24

Вы можете преобразовать свою строку в карту, а затем заполнить ее из элементов сортировки карты Map <String, Sort.Direction>, где id будет именем столбца и порядком значений

Mykhailo Moskura 15.11.2018 15:27

хорошо, теперь вы поняли проблему, может быть, есть метод по умолчанию, который Spring использует для того же, конечно, я могу написать его вручную, но я не могу поверить, что он никогда не был раскрыт

hdmiimdh 15.11.2018 15:30

если вы имеете в виду решение выше, я не думаю, что спрашивал, как передать параметры конструктору :)

hdmiimdh 15.11.2018 15:36

@MykhailoMoskura Теперь это имеет больше смысла. Учитывая, что формат id,desc,username,asc нестандартен, сборка List<Order> - хороший вариант. Собственно, этим и занимается SortHandlerMethodArgumentResolver. Проголосовали.

Andrew Tobilko 15.11.2018 15:59

@ Андрей Тобилко, спасибо

Mykhailo Moskura 15.11.2018 16:05

спасибо, ребята, SortHandlerMethodArgumentResolver действительно делает это, но его метод parseParameterIntoSort для анализа аргументов имеет доступ к частному пакету по некоторым скрытым причинам, спасибо принято !!!!

hdmiimdh 15.11.2018 16:17

Для этой цели я написал что-то похожее на то, что есть у 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
}

Другие вопросы по теме