将 @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
只是一个带有 number
和 size
getter 和 setter 的普通旧 pojo。
在最新版本的 Spring 中可以实现类似的功能吗?我意识到我可以只传递 pageNumber
和 pageSize
并绑定为整数,但我宁愿使用和对象,因为我也想支持过滤,这将更加复杂。
您可以像这样将请求参数绑定到 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
究竟需要如何开发。相反,我建议您看看:
- 来自
spring-data-commons
的 code of org.springframework.data.web.PageableHandlerMethodArgumentResolver
,以及
- 其文档:参见 Section 3.7.1. Web support 中的 "HandlerMethodArgumentResolvers for Pageable and Sort"。
(也许我的 this answer 可以帮助您了解如何处理 HandlerMethodArgumentResolver
以及如何注册它们)
因此您可以开发自己的 HandlerMethodArgumentResolver
或仅使用 PageableHandlerMethodArgumentResolver
形式 spring-data.
我想在 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
只是一个带有 number
和 size
getter 和 setter 的普通旧 pojo。
在最新版本的 Spring 中可以实现类似的功能吗?我意识到我可以只传递 pageNumber
和 pageSize
并绑定为整数,但我宁愿使用和对象,因为我也想支持过滤,这将更加复杂。
您可以像这样将请求参数绑定到 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
究竟需要如何开发。相反,我建议您看看:
- 来自
spring-data-commons
的 code oforg.springframework.data.web.PageableHandlerMethodArgumentResolver
,以及 - 其文档:参见 Section 3.7.1. Web support 中的 "HandlerMethodArgumentResolvers for Pageable and Sort"。
(也许我的 this answer 可以帮助您了解如何处理 HandlerMethodArgumentResolver
以及如何注册它们)
因此您可以开发自己的 HandlerMethodArgumentResolver
或仅使用 PageableHandlerMethodArgumentResolver
形式 spring-data.