springboot 中的多个请求参数可分页
multiple requestparam in springboot pageable
我知道这个问题可能会重复但是我试了很多都没有成功
我需要在 spring boot rest controller 中创建多个 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 是在搜索中解析字段的方式
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);
}
您的 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 对象。
使用 Spring 引导,您只需注册 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
我知道这个问题可能会重复但是我试了很多都没有成功
我需要在 spring boot rest controller 中创建多个 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 是在搜索中解析字段的方式
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);
}
您的 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 对象。
使用 Spring 引导,您只需注册 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