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

Clean way to bind @RequestParam to an object instead of a simple type

我想在 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 只是一个带有 numbersize getter 和 setter 的普通旧 pojo。

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

您可以像这样将请求参数绑定到 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=25 这样的请求,那么 page 参数将填充这些值。另请注意,没有 @RequestParam 注释。

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

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

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

Is something like this possible in the latest version of Spring?

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

HandlerMethodArgumentResolver.

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

(也许我的 this answer 可以帮助您了解如何处理 HandlerMethodArgumentResolver 以及如何注册它们)

因此您可以开发自己的 HandlerMethodArgumentResolver 或仅使用 PageableHandlerMethodArgumentResolver 形式 spring-data.