3 回答
TA贡献1836条经验 获得超4个赞
如果使用方法参数验证,则应使用 对控制器进行批注,如文档所述:@Validated
要获得 Spring 驱动方法验证的资格,所有目标类都需要使用 Spring 的注释进行注释。((可选)还可以声明要使用的验证组。有关 Hibernate Validator 和 Bean Validation 1.1 提供程序的设置详细信息,请参阅 javadoc。@ValidatedMethodValidationPostProcessor
这意味着您应该将代码更改为:
@Validated // Add this
@RestController
public class MyApi {
// ...
}
之后,如果验证不匹配,它将抛出一个。ContraintViolationException
但请注意,由于您只有注释,因此如果您不提供 ,则集合将是,并且该集合也将有效。如果不希望这样做,则还应添加批注,或从 中删除值。@Size()programEndTimenull@NotNullrequired = false@RequestParam
不能使用 though 来检索错误,因为这仅适用于模型属性或请求正文。您可以做的是为 定义一个异常处理程序:BindingResultConstraintViolationException
@ExceptionHandler(ConstraintViolationException.class)
public void handleConstraint(ConstraintViolationException ex) {
System.out.println("Error");
}
TA贡献1860条经验 获得超8个赞
根据 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)
有关详细信息,请查看容器元素约束。
TA贡献1824条经验 获得超6个赞
您可以使用类和@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(",.,.");
}
添加回答
举报