java - 在 Pageable 中传递到 Spring Controller 的排序将方向附加到属性名称,导致 SQL 错误

标签 java spring spring-boot pagination spring-webclient

我需要从另一个 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 拆分为其组件,因为我不确定如何立即传递整个对象,因为它不是第二个应用程序中的命名参数。请注意,此时,排序看起来很好,并且按其应有的方式显示,firstNameASC 分别作为属性名称和方向的单独值。

调用的应用

@GetMapping("/rest/users")
    public List<User> getUsersByAccount(@RequestParam Long accountId, Pageable pageable) {
        return userService.getUsersByAccount(accountId, pageable);
}

最佳答案

作为@M。 Deinum 提到,SorttoString() 不会生成可以直接序列化回 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/

相关文章:

java - 使用 Spring Boot Maven 插件作为构建器,Runnable Jar (JavaFx) 无法找到 log4j2.xml

java - 使用 JsonView 有选择地隐藏字段

java - 如何从一个类的多个构造函数中调用一个公共(public)静态实用程序方法,而跨构造函数只调用一次?

java - 保存在属性文件中的数据源设置直到重启后才加载

java - 创建binder时,Spring Cloud config + 总线对配置服务器调用两次

java - 为 @ExceptionHandler 中的每个异常生成正确的状态

java - Spring MVC : issue between xml and annotation configurations

java - JUnit/Mockito : throwing an exception in a new thread

java - 如何在 spring-data-mongodb 框架中将 BigDecimal 转换为 Double

java - 在 Spring Boot 2.1.1.RELEASE 中的 RestTemplate 中添加 Http header