我需要从另一个 Spring Boot 应用程序调用我的 Spring Boot 应用程序中的可分页端点。我试图将可分页选项从第一个应用程序传递到第二个应用程序,但遇到属性名称为 firstName: ASC
的问题。当方向附加到该方向时,它会变成 firstName: ASC: ASC
,这会导致 JPA 查询抛出异常。
将可分页选项从我的第一个端点传递到第二个端点的正确方法是什么?
调用应用
@GetMapping("/v1/users")
public Flux<User> getUsersByAccount(@RequestParam Long accountId,
@PageableDefault(size = 10, sort = "firstName") Pageable pageable) {
return userService.getUsersByAccount(accountId, pageable);
}
public Flux<User> getUsersByAccount(Long accountId, Pageable pageable) {
int page = pageable.getPageNumber();
int size = pageable.getPageSize();
Sort sort = pageable.getSort();
return webClient.backendService()
.get().uri(builder -> builder
.path("/rest/users")
.queryParam("accountId", accountId)
.queryParam("page", page)
.queryParam("size", size)
.queryParam("sort", sort)
.build())
.retrieve()
.bodyToFlux(ContactInfo.class);
}
我将 Pageable 拆分为其组件,因为我不确定如何立即传递整个对象,因为它不是第二个应用程序中的命名参数。请注意,此时,排序看起来很好,并且按其应有的方式显示,firstName
和 ASC
分别作为属性名称和方向的单独值。
调用的应用
@GetMapping("/rest/users")
public List<User> getUsersByAccount(@RequestParam Long accountId, Pageable pageable) {
return userService.getUsersByAccount(accountId, pageable);
}
最佳答案
作为@M。 Deinum 提到,Sort
的 toString()
不会生成可以直接序列化回 Sort
对象的表示形式,(并且对象上没有这样的方法来执行此操作)。
您可以将其转换为正确的形式,如下所示:
List<String> sorts = new ArrayList<>();
sort.forEach(order -> sorts.add(String.join(",", order.getProperty(), order.getDirection().toString())));
builder.queryParam("sort", sorts.toArray());
这会生成 ["propertyName,direction"]
的正确表示。
关于java - 在 Pageable 中传递到 Spring Controller 的排序将方向附加到属性名称,导致 SQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60775680/