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

我想将我所有的查询参数收集到一个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的字段中设置给定的请求参数。

请指教。

回答:

之前已经有人打算使用此功能,因此您可以执行以下操作。但是很遗憾,由于不活动响应,该功能被拒绝了:

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来按以下顺序解析参数:

  • 从模型(如果已通过使用模型添加)。
  • 通过使用@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){

}

笔记:

  • 没有为没有等效注释@RequestParamdefaultValue,所以需要在构造函数中手动实现。

  • 如果controller方法参数与this中的值不匹配,@ModelAttribute即使@ModelAttribute没有显式注释它,它也将被解析。

以上是 如何将所有用@RequestParam注释的字段收集到一个对象中 的全部内容, 来源链接: utcz.com/qa/435725.html

回到顶部