我想将所有查询参数收集到一个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
上设置这些字段,我必须将请求参数的名称与字段名称匹配。但这不是有效的变量名:page-size
。
必须有一些变通方法,类似于@RequestParam
的value属性,它将在DTO的字段中设置给定的请求参数。
请告知。
答案 0 :(得分:1)
有人已经将feature用于此用途,因此您可以执行以下操作。但是很遗憾,由于不活动响应,它被拒绝了:
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
,它将解析以下orders中的参数:
- 从模型中获取(如果已经通过使用Model添加)。
- 使用@SessionAttributes从HTTP会话中获取。
- 来自通过Converter的URI路径变量(请参见下一个示例)。
- 通过默认构造函数的调用。
- 通过调用具有与Servlet请求参数匹配的参数的“主要构造函数”。参数名称是通过JavaBeans @ConstructorProperties或字节码中运行时保留的参数名称确定的。
这意味着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){
}
注意:
@RequestParam
的{{1}}没有等效的注释,因此需要在构造函数中手动实现。
如果控制器方法参数与this中的值不匹配,即使未显式标注defaultValue
,它也将解析为@ModelAttribute
。
答案 1 :(得分:0)
说实话,这似乎是对弹簧启动中已经存在的功能的大量努力。您可以从PagingAndSortingRepository
扩展存储库,并在调用集合资源时添加分页。
或者您可以编写自定义查询方法(或覆盖现有查询方法)并添加以下内容:
Page<Person> findByFirstname(String firstname, Pageable pageable);
通过这种方式,Spring Boot会自动将所有想要的参数添加到请求中。