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

时间:2015-11-08 09:15:58

标签: spring spring-mvc spring-rest

我想在我正在编写的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,有numbersize吸气剂和制定者。

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

2 个答案:

答案 0 :(得分:2)

您可以将请求参数绑定到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中的Spring Data JPA作为灵感。

答案 1 :(得分:1)

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

  

在最新版本的Spring中是否可以这样?

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

<强> HandlerMethodArgumentResolver

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

(我的Section 3.7.1. Web support可能会帮助您了解如何处理HandlerMethodArgumentResolver以及如何注册它们

因此,您可以开发自己的HandlerMethodArgumentResolver或仅使用PageableHandlerMethodArgumentResolver表格弹簧数据。