在get请求中传递Spring可分页



如果我从Spring应用程序发送请求:

public ResponseEntity<RestResponsePage<Result>> readDocs(
Pageable pageable
) {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Authorization", getToken());
String requestUri = 
baseAppUrl + "/api/k" + "?page={page}&pageSize={pageSize}&sort={sort}&pageable={pageable}";
Map<String, Object> urlParameters = new HashMap<>();
urlParameters.put("page", Integer.toString(pageable.getPageNumber()));
urlParameters.put("pageSize", Long.toString(pageable.getPageSize()));
urlParameters.put("sort", pageable.getSort());
urlParameters.put("pageable", pageable);
HttpEntity<Void> requestEntity = new HttpEntity<>(requestHeaders);
ResponseEntity<RestResponsePage<Result>> response = restTemplate.exchange( RestResponsePage
requestUri,
HttpMethod.GET,
requestEntity,
new ParameterizedTypeReference<RestResponsePage<Result>>() {},
urlParameters
);
return response;
}

到另一个Spring应用程序:

@GetMapping("/")
@PageableAsQueryParam
public ResponseEntity<Page<Result>> getAll(
@RequestHeader("Authorization") String token,
@RequestParam("page") Integer page,
@RequestParam("pageSize") Integer pageSize,
@RequestParam("sort") String sort,
@RequestParam("pageable") Pageable pageable
) {
... 
}

我有一个错误说:

Resolved [org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException: 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]

我知道我可以像上面的例子一样通过字段单独传递它:page,pageSize

但我也想发送Sort,这是在Pageable对象-这也没有正确地反序列化为类型Sort

我怎样才能使Pageable是正确的deserialized?

编辑:对于答案,我增加了如下功能:

UriComponentsBuilder withPageable(UriComponentsBuilder builder,
Pageable pageable) {
builder.queryParam("page", pageable.getPageNumber()).queryParam("size",
pageable.getPageSize());
if (pageable.getSort() != null) {
StringBuilder sb = new StringBuilder();
pageable.getSort().forEach(order -> {
sb.append(order.getProperty()).append(",").append(order.getDirection());
});
builder.queryParam("sort", sb.toString());
}
return builder;
}

使sort正确反序列化。

不需要使用@RequestParam("pageable")。分页信息的抽象接口。Pageable

上已经提供了pageSize, pageNumber, sort

样品控制器

@Controller
public class Controller {
@GetMapping("/...")
public List<...> findAll(Pageable pageable) {
log.debug("pageable: {}", pageable);
// ...
}
}

MockRequetBuilders

RequestBuilder request = MockMvcRequestBuilders.get("/url")
.param("page", "1")
.param("size", "5")
.param("sort", "name,DESC"); // column, ASC|DESC
ResultActions actions = mockMvc.perform(request);
actions.andExpect(...);

创建RestTemplate

URI uri = UriComponentsBuilder.fromHttpUrl("/url")
.queryParam("page", pageable.getPageNumber())
.queryParam("size", pageable.getPageSize())
.queryParam("sort", pageable.getSort())
.build()
.toUri();
HttpHeaders headers = new HttpHeaders();
headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
HttpEntity<?> entity = new HttpEntity<>(headers);
ResponseEntity<...> response = restTemplate.exchange(uri, HttpMethod.GET, entity, ...);

https://reflectoring.io/spring-boot-paging/

https://cursos.alura.com.br/forum/topico - -初级或单一的独特构造函数-发现-界面-组织- springframework数据域-可分页- 195442

最新更新