Spring MVC에는 Java Bean 유효성 검사를 사용하는 옵션을 포함하여 @RequestMapping
메서드에 대한 유효성 검사 지원이 내장되어 있습니다. 검증 지원은 두 가지 수준에서 작동합니다.
먼저 @ModelAttribute, @RequestBody 및 @RequestPart 메서드 매개 변수에 대한 해석기는 매개 변수에 Jakarta의 @Valid
또는 Spring의 @Validated
annotation이 있는 경우 유효성 검사를 수행하고 필요한 경우 MethodArgumentNotValidException
을 발생시킵니다. 또는 검증된 매개 변수 바로 뒤에 Errors
또는 BindingResult
메서드 매개 변수를 추가하여 컨트롤러 메서드의 오류를 처리할 수 있습니다.
둘째, Java Bean 유효성 검증이 존재하고 메소드 매개변수에 @Constraint
annotation이 있는 경우 메소드 유효성 검증이 대신 적용되어 필요한 경우 HandlerMethodValidationException
이 발생합니다. 이 경우 Errors
또는 BindingResult
메서드 매개 변수를 추가하여 컨트롤러 메서드 내에서 유효성 검사 오류를 처리할 수 있지만, 다른 메서드 인수에 유효성 검사 오류가 있으면 대신 HandlerMethodValidationException
이 발생합니다. 메소드에 @Valid
또는 @Constraint
annotation이 추가된 경우 메소드 유효성 검증이 반환 값에 적용될 수 있습니다.
WebMvc 구성을 통해 전역적으로 Validator
를 구성하거나 @Controller
또는 @ControllerAdvice
의 @InitBinder 메서드를 통해 로컬로 구성할 수 있습니다. 여러 validator를 사용할 수도 있습니다.
[Note]
컨트롤러에@Validated
클래스 수준이 있으면 AOP 프록시를 통해 메서드 유효성 검사가 적용됩니다. Spring Framework 6.1에 추가된 메서드 유효성 검사를 위한 Spring MVC 내장 지원을 활용하려면 컨트롤러에서 클래스 수준@Validated
annotation을 제거해야 합니다.
오류 응답 섹션에서는 MethodArgumentNotValidException
및 HandlerMethodValidationException
이 처리되는 방법과 MessageSource
및 로케일 및 언어별 리소스 번들을 통해 해당 렌더링을 사용자 정의할 수 있는 방법에 대한 자세한 내용을 제공합니다.
메서드 유효성 검사 오류를 추가로 사용자 지정 처리하려면 ResponseEntityExceptionHandler
를 확장하거나 컨트롤러 또는 @ControllerAdvice
에서 @ExceptionHandler
메서드를 사용하고 HandlerMethodValidationException
을 직접 처리할 수 있습니다. 예외에는 메서드 매개 변수별로 유효성 검사 오류를 그룹화하는 ParameterValidationResults
목록이 포함되어 있습니다. 이를 반복하거나 컨트롤러 메서드 매개변수 유형별로 방문자에게 콜백 메서드를 제공할 수 있습니다.
HandlerMethodValidationException ex = ... ;
ex.visitResults(new HandlerMethodValidationException.Visitor() {
@Override
public void requestHeader(RequestHeader requestHeader, ParameterValidationResult result) {
// ...
}
@Override
public void requestParam(@Nullable RequestParam requestParam, ParameterValidationResult result) {
// ...
}
@Override
public void modelAttribute(@Nullable ModelAttribute modelAttribute, ParameterErrors errors) {
// ...
@Override
public void other(ParameterValidationResult result) {
// ...
}
});