将@RequestParam 绑定到对象而不是简单类型的简洁方法

jax*_*jax 3 spring spring-mvc spring-rest

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

GET /people?page[number]=1page[size]=25
Run Code Online (Sandbox Code Playgroud)

或者可能

GET /people?page.number=1page.size=25
Run Code Online (Sandbox Code Playgroud)
  • 上面的请求只是我正在尝试做的一个例子,如果您知道发送请求的更简洁的方式,请提供建议。

然后

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

}
Run Code Online (Sandbox Code Playgroud)

PaginationInformation只是一个普通的老用POJOnumbersizegetter和setter方法。

在最新版本的 Spring 中,这样的事情可能吗?我意识到我可以只传递pageNumberpageSize绑定为整数,但我宁愿使用和对象,因为我还想支持过滤,这将更加复杂。

Boh*_*rdt 6

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

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

    // Getters and setters omitted
}

@RequestMapping("/people")
public void findAll(Page page) {
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果您需要更灵活地自定义分页参数的分辨率,您可以实现 custom HandlerMethodArgumentResolver. 您可以使用PageableHandlerMethodArgumentResolver春天JPA的数据,如果你决定走这条路作为灵感(或使用Spring数据JPA的持久层)。