【问题标题】:How to manually create Pageable object from a string如何从字符串手动创建可分页对象
【发布时间】:2018-11-15 14:18:04
【问题描述】:

我没有找到任何地方是否可以从字符串手动创建可分页,假设我们有以下服务方法

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&用户名,asc

编辑

更多细节我正在寻找一种机制,即 spring 如何将作为查询参数到达其余端点的“排序”字符串(带有其余默认参数)转换为 Pageable 对象

【问题讨论】:

  • 给定格式是什么意思? id,desc,username,asc 你可能是说sort=id,desc&amp;sort=username,asc 吗?这就是 Spring 识别 Sort 对象的方式
  • 在我的情况下感谢这些参数以 id,desc&username,asc 字符串的形式出现,更新了格式,抱歉造成混淆

标签: java spring


【解决方案1】:

你可以这样做:

private Sort orderBy() {
    return new Sort(Sort.Direction.DESC, "ID")
                .and(new Sort(Sort.Direction.ASC, "username"));
}

我认为这很有帮助

排序类有静态嵌套类Order:

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 填充其中 id 将是列名和值顺序
  • @MykhailoMoskura 现在,它更有意义了。考虑到id,desc,username,asc 的格式不规则,构建List&lt;Order&gt; 是一个不错的选择。实际上,这就是SortHandlerMethodArgumentResolver 所做的。赞成。
【解决方案2】:

为此,我写了一些类似于 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多