我需要从另一个Spring应用程序中调用Spring应用程序中的一个可分页端点。我试图将可分页选项从第一个应用程序传递到第二个应用程序,但我遇到了一个问题,即属性名是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
分别作为属性名称和方向的单独值显示。
称为app
@GetMapping("/rest/users")
public List<User> getUsersByAccount(@RequestParam Long accountId, Pageable pageable) {
return userService.getUsersByAccount(accountId, pageable);
}
发布于 2020-04-23 04:32:58
正如@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"]
的正确表示。
发布于 2022-03-19 21:18:03
控制器我们可以捕获HttpServletRequest,如下所示
public ResponseEntity<Page<PriceBook>> getAll(HttpServletRequest servletRequest) {
return new ResponseEntity<>(priceBookService.findAll(servletRequest), HttpStatus.OK);
}
按照以下方式使用queryString将所有请求参数传递给后端服务
public PageableResponse<PriceBook> getPbAllWithFilter(HttpServletRequest servletRequest) {
return webClient.get().uri(pbUrl.concat("?").concat(servletRequest.getQueryString()))
.accept(MediaType.APPLICATION_JSON)
.header(CORRELATION_ID, MDC.get(CORRELATION_ID_MDC))
.exchange()
.flatMap(this::getSubscriptionAll)
.block();
}
https://stackoverflow.com/questions/60775680
复制相似问题