Spring boot 如何将带有@RequestParam注释的所有字段收集到一个对象中
我希望将所有查询参数收集到一个pojo中,并对字段执行额外的验证 我已经读到,我可以简单地创建一个对象,SpringBoot将自动在其上设置这些请求参数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)整数页面大小… 我正在考虑创建
@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
分页和排序存储库
扩展存储库,并在调用集合资源时添加分页
或者,您可以编写自定义查询方法(或覆盖现有方法)并添加以下内容:
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映射它们