Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何将带有@RequestParam注释的所有字段收集到一个对象中_Spring Boot_Spring Mvc - Fatal编程技术网

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

Spring boot 如何将带有@RequestParam注释的所有字段收集到一个对象中,spring-boot,spring-mvc,Spring Boot,Spring Mvc,我希望将所有查询参数收集到一个pojo中,并对字段执行额外的验证 我已经读到,我可以简单地创建一个对象,SpringBoot将自动在其上设置这些请求参数 @GetMaping public ResponseEntity列表项(@RequestParam(value=“page number”,defaultValue=“0”)@Min(0)整数页码, @RequestParam(value=“page size”,defaultValue=“100”)@Min(1)整数页面大小… 我正在考虑创建

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

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

@GetMaping
public ResponseEntity列表项(@RequestParam(value=“page number”,defaultValue=“0”)@Min(0)整数页码,
@RequestParam(value=“page size”,defaultValue=“100”)@Min(1)整数页面大小…

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

但是为了在
RequestParamsDTO
上设置这些字段,我必须将请求参数的名称与字段名称匹配。但它不是有效的变量名:
页面大小

必须有一些解决方法,类似于
@RequestParam
的value属性,可以在DTO中的my字段上设置给定的请求参数


请告知。

之前有人已经有意这样做,以便您可以执行以下操作。但不幸的是,由于不活动响应,此操作被拒绝:

public class RequestParamsDTO{
   @RequestParam(value="page-number",defaultValue="0")
   @Min(0)
   private Integer pageNumber;

   @RequestParam(value = "page-size", defaultValue = "100") 
   @Min(1) 
   Integer pageSize 
}
您可以做的最类似的事情是使用其
@modeldattribute
,它将解析以下参数:

  • 如果已使用模型添加,则从模型中删除
  • 使用@SessionAttributes从HTTP会话中删除
  • 从通过转换器传递的URI path变量(参见下一个示例)
  • 从默认构造函数的调用
  • 从调用“主构造函数”开始,其参数与Servlet请求参数匹配。参数名称通过JavaBeans@constructorproperty或字节码中运行时保留的参数名称确定
这意味着
RequestParamsDTO
不能有任何默认构造函数(没有参数的构造函数)。它应该有一个“主构造函数”,您可以使用
@ConstructorProperties
来定义哪些请求参数映射到构造函数参数:

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;
    }
}
控制器方法变为:

@GetMaping
public ResponseEntity<?> listEntities(@Valid RequestParamsDTO request){

}
@GetMaping
public ResponseEntity列表项(@Valid RequestParamsDTO request){
}
注:

  • @RequestParam
    defaultValue
    没有等价的注释,因此需要在构造函数中手动实现

  • 如果控制器方法参数与中的值不匹配,则它将解析为
    @modeldattribute
    ,即使
    @modeldattribute
    未在其上显式注释


之前已经有人打算这样做,以便您可以执行以下操作。但不幸的是,由于不活动响应,该计划被拒绝:

public class RequestParamsDTO{
   @RequestParam(value="page-number",defaultValue="0")
   @Min(0)
   private Integer pageNumber;

   @RequestParam(value = "page-size", defaultValue = "100") 
   @Min(1) 
   Integer pageSize 
}
您可以做的最类似的事情是使用其
@modeldattribute
,它将解析以下参数:

  • 如果已使用模型添加,则从模型中删除
  • 使用@SessionAttributes从HTTP会话中删除
  • 从通过转换器传递的URI path变量(参见下一个示例)
  • 从默认构造函数的调用
  • 从调用“主构造函数”开始,其参数与Servlet请求参数匹配。参数名称通过JavaBeans@constructorproperty或字节码中运行时保留的参数名称确定
这意味着
RequestParamsDTO
不能有任何默认构造函数(没有参数的构造函数)。它应该有一个“主构造函数”,您可以使用
@ConstructorProperties
来定义哪些请求参数映射到构造函数参数:

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;
    }
}
控制器方法变为:

@GetMaping
public ResponseEntity<?> listEntities(@Valid RequestParamsDTO request){

}
@GetMaping
public ResponseEntity列表项(@Valid RequestParamsDTO request){
}
注:

  • @RequestParam
    defaultValue
    没有等价的注释,因此需要在构造函数中手动实现

  • 如果控制器方法参数与中的值不匹配,则它将解析为
    @modeldattribute
    ,即使
    @modeldattribute
    未在其上显式注释


老实说,对于已经存在于spring boot中的功能来说,这似乎需要付出很多努力。您可以从
分页和排序存储库
扩展存储库,并在调用集合资源时添加分页

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

Page<Person> findByFirstname(String firstname, Pageable pageable);
Page findByFirstname(字符串firstname,可分页);

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

老实说,对于spring boot中已经存在的功能来说,这似乎需要付出很多努力。您可以从
分页和排序存储库
扩展存储库,并在调用集合资源时添加分页

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

Page<Person> findByFirstname(String firstname, Pageable pageable);
Page findByFirstname(字符串firstname,可分页);

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

不确定这是否有效。尝试使用
@JsonProperty(“页面大小”)
为什么不在请求正文中将它们全部设置为json,然后使用POJO在控制器中使用@requestbody进行映射,因为GET请求时提交有效负载不是rest-y,因此查询参数是尝试的
@JsonProperty
,它不起作用了,我不敢相信它没有机制!不确定这是否有效。尝试使用
@JsonProperty(“页面大小”)
为什么不在请求正文中将它们全部设置为json,然后使用POJO在控制器中使用@Reque映射它们