如何从字符串手动创建Pageable对象

时间:2018-11-15 14:18:05

标签: java spring

我没有发现是否可以通过字符串手动创建可分页的页面,假设我们具有以下服务方法

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如何将作为剩余参数作为对Pageable对象的查询参数的'sort'字符串(带有其余的默认参数)转换

2 个答案:

答案 0 :(得分:5)

您可以:

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创建订单,就像简单地拆分一样。

答案 1 :(得分:1)

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