我正在创建一个Spring-Boot微服务REST API,该API期望类型为@RequestParam
的{{1}}。如何验证列表包含最小和最大数量的值?
到目前为止,我已经尝试使用List<String>
,它也应该支持集合(@Size(min=1, max=2)
)。
我还尝试添加javax.validation.constraints.Size
和@Valid
参数以及BindingResult
注释,但没有成功。
我更喜欢使用类似于第一个示例的解决方案,该方案更紧凑,更整洁,使用@Size
。这是针对Spring-Boot 2.1.2.RELEASE的。
@Size(min=1, max=2)
我希望能到达@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");
}
}
}
行,但实际上已被跳过。
答案 0 :(得分:5)
如果您正在使用方法参数验证,则应使用@Validated
注释控制器,如GROUP_CONCAT()
所述:
要有资格通过Spring驱动的方法验证,所有目标类都必须使用Spring的
@Validated
注释进行注释。 (或者,您也可以声明要使用的验证组。)有关Hibernate Validator和Bean Validation 1.1提供程序的设置详细信息,请参见MethodValidationPostProcessor
Javadoc。
这意味着您应该将代码更改为:
@Validated // Add this
@RestController
public class MyApi {
// ...
}
此后,如果验证不匹配,它将抛出ContraintViolationException
。
但是请注意,由于您只有@Size()
批注,因此如果您不提供programEndTime
,则该集合将为null
,并且该集合也将有效。如果您不希望这样做,则还应添加一个@NotNull
批注,或从required = false
中删除@RequestParam
的值。
尽管您不能使用BindingResult
来检索错误,因为它仅适用于模型属性或请求正文。您可以做的是为ConstraintViolationException
定义一个异常处理程序:
@ExceptionHandler(ConstraintViolationException.class)
public void handleConstraint(ConstraintViolationException ex) {
System.out.println("Error");
}
答案 1 :(得分:0)
您可以使用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(",.,.");
}
答案 2 :(得分:0)
根据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。