如何验证 List 类型的@RequestParam 的大小
How to validate the size of @RequestParam of type List
我正在创建一个 Spring-Boot 微服务 REST API,它需要 @RequestParam
类型 List<String>
。我如何验证列表是否包含最小值和最大值?
到目前为止,我已经尝试使用 @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
注释您的控制器,如 the documentation 所述:
To be eligible for Spring-driven method validation, all target classes need to be annotated with Spring’s @Validated
annotation. (Optionally, you can also declare the validation groups to use.) See the MethodValidationPostProcessor
javadoc for setup details with the Hibernate Validator and Bean Validation 1.1 providers.
这意味着您应该将代码更改为:
@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");
}
你可以用一个Class和@RequestBody做参数校验,和我一样成功
public class Test {
@Size(min = 1 , max = 5)
private List<String> programEndTime;
public List<String> getProgramEndTime() {
return programEndTime;
}
public void setProgramEndTime(List<String> programEndTime) {
this.programEndTime = programEndTime;
}
}
@PostMapping("test")
public void test( @Valid @RequestBody Test test,
BindingResult result){
if (result.hasErrors()) {
System.out.println("Error");
} else {
System.out.println("OK");
}
System.out.println(",.,.");
}
根据 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)
有关详细信息,请查看 Container element constraints。
我正在创建一个 Spring-Boot 微服务 REST API,它需要 @RequestParam
类型 List<String>
。我如何验证列表是否包含最小值和最大值?
到目前为止,我已经尝试使用 @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
注释您的控制器,如 the documentation 所述:
To be eligible for Spring-driven method validation, all target classes need to be annotated with Spring’s
@Validated
annotation. (Optionally, you can also declare the validation groups to use.) See theMethodValidationPostProcessor
javadoc for setup details with the Hibernate Validator and Bean Validation 1.1 providers.
这意味着您应该将代码更改为:
@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");
}
你可以用一个Class和@RequestBody做参数校验,和我一样成功
public class Test {
@Size(min = 1 , max = 5)
private List<String> programEndTime;
public List<String> getProgramEndTime() {
return programEndTime;
}
public void setProgramEndTime(List<String> programEndTime) {
this.programEndTime = programEndTime;
}
}
@PostMapping("test")
public void test( @Valid @RequestBody Test test,
BindingResult result){
if (result.hasErrors()) {
System.out.println("Error");
} else {
System.out.println("OK");
}
System.out.println(",.,.");
}
根据 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)
有关详细信息,请查看 Container element constraints。