我没有发现是否可以从字符串手动创建可分页,假设我们有以下服务方法
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.排序
从给定的格式字符串中,重要的是要注意这些参数是动态chagned的,因此我更有可能需要一个指向Spring解析器的路径,在我的示例中,我传递null而不是对象
id, desc
编辑
更多细节我正在寻找一种机制,说明Spring如何将作为查询参数到达其余endpoint的“排序”字符串(带有其余默认参数)转换为可分页对象
你可以这样做:
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)
从字符串创建订单,就像简单地拆分一样。
出于这个目的,我写了一些类似于Spring的东西,如果Spring公开SortHandlerFacodArgumentResolver. 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
}