我正在创建一个需要List<String>
类型的@RequestParam
的Spring-Boot微服务REST API。如何验证列表是否包含最小和最大数量的值?
到目前为止,我已经尝试使用@Size(min=1, max=2)
它也应该支持集合(javax.validation.constraints.Size
)。
我还尝试添加@Valid
和BindingResult
参数以及@Size
注释,但没有成功。
我更喜欢使用类似于第一个示例的解决方案,使用@Size(min=1, max=2)
更紧凑、更整洁。这是针对 Spring-Boot 2.1.2.RELEASE。
@RestController
public class MyApi {
@GetMapping(value = "/myApi", produces = { APPLICATION_JSON_VALUE })
public ResponseEntity<List<MyObject>> getSomething(@Valid @RequestParam(value = "programEndTime", required = false) @Size(min = 1, max = 2) List<String> programEndTime, BindingResult result) {
if (result.hasErrors()) {
System.out.println("Error");
} else {
System.out.println("OK");
}
}
}
我希望到达System.out.println("Error")
线,但实际上它被跳过了。
如果您使用的是方法参数验证,则应使用@Validated
注释您的控制器,如文档所述:
为了有资格进行 Spring 驱动的方法验证,所有目标类都需要使用 Spring 的
@Validated
注释进行注释。(可选)还可以声明要使用的验证组。请参阅MethodValidationPostProcessor
javadoc 以了解 Hibernate Validator 和 Bean Validation 1.1 提供程序的设置详细信息。
这意味着您应该将代码更改为:
@Validated // Add this
@RestController
public class MyApi {
// ...
}
之后,如果验证不匹配,它将引发ContraintViolationException
。
但请注意,由于您只有@Size()
注释,如果您不提供programEndTime
,则集合将被null
,并且也将有效。如果您不希望这样做,则还应添加@NotNull
注释,或从@RequestParam
中删除required = false
值。
但是,不能使用该BindingResult
来检索错误,因为这仅适用于模型属性或请求正文。您可以做的是为ConstraintViolationException
定义一个异常处理程序:
@ExceptionHandler(ConstraintViolationException.class)
public void handleConstraint(ConstraintViolationException ex) {
System.out.println("Error");
}
根据 Bean Validator 2.0,Hibernate Validator 6.x,您可以直接对参数化类型使用约束。
@GetMapping(path = "/myApi", produces = { APPLICATION_JSON_VALUE })
public ResponseEntity<List<MyObject>> getSomething(@RequestParam(value = "programEndTime", required = false) List<@Size(min = 1, max = 2) String> programEndTimes)
有关详细信息,请查看容器元素约束。