首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将带@RequestParam注释的所有字段收集到一个对象中

如何将带@RequestParam注释的所有字段收集到一个对象中
EN

Stack Overflow用户
提问于 2019-06-05 22:17:10
回答 2查看 2.6K关注 0票数 2

我希望将所有查询参数收集到pojo中,并对字段执行额外的验证。

我已经读到,我可以简单地创建一个对象,spring-boot将自动在其上设置这些请求参数。

@GetMaping public ResponseEntity<?> listEntities(@RequestParam(value = "page-number", defaultValue = "0") @Min(0) Integer pageNumber, @RequestParam(value = "page-size", defaultValue = "100") @Min(1) Integer pageSize ... )

我正在考虑创建一个名为RequestParamsDTO的类,在这个类中,我将让查询参数负责分页。

但是,为了在RequestParamsDTO上设置这些字段,我必须将请求param的名称与字段名匹配。但是它不会是一个有效的变量名:page-size

必须有一些解决办法,类似于@RequestParam的value属性,这将在DTO中的字段中设置给定的请求参数。

请给我建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-06 03:48:07

在此之前,有人已经指定了此功能,因此您可以执行以下.But,不幸的是,由于不活动响应,它被拒绝了:

代码语言:javascript
运行
复制
public class RequestParamsDTO{
   @RequestParam(value="page-number",defaultValue="0")
   @Min(0)
   private Integer pageNumber;

   @RequestParam(value = "page-size", defaultValue = "100") 
   @Min(1) 
   Integer pageSize 
}

您可以做的最相似的事情是使用它的@ModelAttribute,它将解析以下订单中的参数:

  • 如果已经通过使用Model添加,则从该模型中删除。
  • 在HTTP会话中使用@SessionAttributes。
  • 通过转换器传递的URI路径变量(请参阅下一个示例)。
  • 从默认构造函数的调用。
  • 调用具有与Servlet请求参数匹配的参数的“主构造函数”。参数名通过字节码中的JavaBeans @ConstructorProperties或运行时保留的参数名确定。

这意味着RequestParamsDTO不能没有任何默认的构造函数(构造函数,即没有参数),.It应该有一个“主构造函数”,您可以使用@ConstructorProperties来定义哪些请求参数映射到构造函数参数:

代码语言:javascript
运行
复制
public class RequestParamsDTO{
    @Min(0)
    Integer pageNumber;
    @Min(1)
    Integer pageSize;

    @ConstructorProperties({"page-number","page-size"})
    public RequestParamsDTO(Integer pageNumber, Integer pageSize) {
        this.pageNumber = pageNumber != null ? pageNumber : 0;
        this.pageSize = pageSize != null ? pageSize : 100;
    }
}

所述控制器方法为:

代码语言:javascript
运行
复制
@GetMaping
public ResponseEntity<?> listEntities(@Valid RequestParamsDTO request){

}

备注:

  • @RequestParamdefaultValue没有等效的注释,因此需要在构造函数中手动实现。
  • 如果控制器方法参数与中的值不匹配,则它将解析为@ModelAttribute,即使@ModelAttribute没有显式地对其进行注释。
票数 10
EN

Stack Overflow用户

发布于 2019-06-06 09:49:27

老实说,对于一个已经存在于spring中的功能来说,这似乎是付出了很大的努力。您可以从PagingAndSortingRepository扩展存储库,并在调用集合资源时添加分页。

也可以编写自定义查询方法(或覆盖现有查询方法)并添加以下内容:

代码语言:javascript
运行
复制
Page<Person> findByFirstname(String firstname, Pageable pageable);

通过这种方式,spring引导将自动向请求中添加所有您想要的参数。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56468760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档