Сортировка, переданная в Pageable для Spring, добавляет направление к имени свойства, вызывая ошибку SQL - PullRequest
0 голосов
/ 20 марта 2020

Мне нужно вызвать конечную точку с возможностью просмотра страниц в моем приложении 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);
}

1 Ответ

0 голосов
/ 23 апреля 2020

как @M. Дейнм упомянул, что 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"].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...