3

我想在我正在编写的 REST API 中允许分页。我想发送如下请求

GET /people?page[number]=1page[size]=25

或者可能

GET /people?page.number=1page.size=25
  • 上面的请求只是我正在尝试做的一个例子,如果您知道发送请求的更简洁的方式,请告知。

然后

@RequestMapping(value = "/people", params = { "page" })
public void findAll(@RequestParam("page") PaginationInformation paginationInformation) { 

}

PaginationInformation只是一个普通的老式 pojo,带有getter 和 setter numbersize

在最新版本的 Spring 中是否可能出现这种情况?我意识到我可以将pageNumberpageSize绑定为整数,但我宁愿使用和对象,因为我还想支持过滤,这将更加复杂。

4

2 回答 2

6

您可以将请求参数绑定到 Spring 中的自定义模型对象,如下所示:

public class Page {
    private int pageOffset;
    private int pageSize;

    // Getters and setters omitted
}

@RequestMapping("/people")
public void findAll(Page page) {
}

如果您像这样发送请求,GET /foo?pageOffset=0&pageSize=25page参数将填充这些值。另请注意,没有@RequestParam注释。

解析Page的对象将在后台提供给处理程序ServletModelAttributeMethodProcessor,因此请随时查看其源代码以获取更多详细信息。

如果您需要更灵活地自定义分页参数的分辨率,您可以实现 custom HandlerMethodArgumentResolver。如果您决定采用这种方式(或将 Spring Data JPA 用于您的持久层),您可以使用PageableHandlerMethodArgumentResolverSpring Data JPA作为灵感。

于 2015-11-08T10:21:14.983 回答
2

Bohuslav Burghardt 在他的回答中解释了最简单的方法:使用命令对象/表单支持对象来选择这两个参数。你明确地问:

在最新版本的 Spring 中是否可能出现这种情况?

因为我认为命令对象方式是众所周知的,所以您要求另一种更强大的方式。是的,有一个(它自 Spring 3.1 起就存在)。

HandlerMethodArgumentResolver.

因为你有一个特殊的用例:分页;我不会解释究竟HandlerMethodArgumentResolver需要如何开发。相反,我建议您看一下:

(也许我的这个答案可以帮助您了解如何处理HandlerMethodArgumentResolver以及如何注册它们)

因此,您可以开发自己的HandlerMethodArgumentResolver或仅使用PageableHandlerMethodArgumentResolver表单 spring-data。

于 2015-11-08T10:48:12.750 回答