2

我知道这个问题可能会重复,但我尝试了很多但没有成功

我需要在spring boot rest控制器中创建多个RequestParam,如下所示:

@GetMapping("/prd-products/test")
@Timed
public ResponseEntity<List<Test>> getAllTests(@RequestParam (required = false) String search, @RequestParam (required = false) Pageable pageable) {
    Page<Test> page = prdProductsService.findAllTest(search, pageable);
    HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/prd-products");
    return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}

当我尝试通过 url 调用此服务时:

http://localhost:9116/api/prd-products/test?search=id==1,id==2&pageable=0&size=2 

它给了我以下错误

"title": "Bad Request",
"status": 400,
"detail": "Failed to convert value of type 'java.lang.String' to required type 'org.springframework.data.domain.Pageable'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'org.springframework.data.domain.Pageable': no matching editors or conversion strategy found",

当我尝试发送一个请求参数时,它成功工作。

注意:id==1,id==2是搜索中解析字段的方式

4

3 回答 3

8

使用 Spring Boot,您只需注册PageableHandlerMethodArgumentResolver bean

@Bean
public PageableHandlerMethodArgumentResolver pageableResolver() {
    return new PageableHandlerMethodArgumentResolver();
}

在控制器中

public ResponseEntity<List<Test>> getAllTests(
    @RequestParam (required = false) String search,
    @PageableDefault(page = 0, size = 100) Pageable pageable
) {
    ...
}

然后将您的查询参数调整为 ...&page=0&size=2

于 2019-08-22T06:58:46.090 回答
1

Spring 无法将 String 转换为 Pageable。您应该从请求参数创建一个 Pageable 对象,例如,使用PageRequest.of

例子:

@GetMapping("/prd-products/test")
@Timed
public ResponseEntity<List<Test>> getAllTests(
        @RequestParam (required = false) String search,
        @RequestParam (required = false) Integer pageIndex,
        @RequestParam (required = false) Integer pageSize) {
    Pageable pageable = PageRequest.of(pageIndex, pageSize);
    Page<Test> page = prdProductsService.findAllTest(search, pageable);
    HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/prd-products");
    return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}
于 2019-08-21T11:43:22.727 回答
0

您的 QueryString 似乎很奇怪。

为了使用 Spring Data REST 创建和注入 Pageable,您需要执行以下操作:

?page=0&size=2&ids=1,2

您的 REST 控制器:

public ResponseEntity <List<Test>> getAllTests(@RequestParam(required = false) String search, @RequestParam(required = false) Pageable pageable) {
    Page<Test> page = prdProductsService.findAllTest(search, pageable);
    return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}

这样,Spring Data REST 将创建一个 Pageable 对象。

请参阅参考文档

于 2019-08-21T11:53:40.007 回答