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(",.,.");
}
添加回答
舉報