@Valid를 사용하여 Controller 단에서 유효성을 검사하고자 했는데 테스트 결과 Controller 단이 아닌 Entity에 접근할때 유효성 에러가 나는 것을 발견하였다.
알아보니 @Valid는 Object 기준이라 Collection일 경우 유효성 검사가 이루어지지 않는 것이었다.
이를 해결하기 위해 아래와 같이 Validator을 커스텀하여 작성한다.
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.SpringValidatorAdapter;
import javax.validation.Validation;
import java.util.Collection;
@Component
public class CustomCollectionValidator implements Validator {
private SpringValidatorAdapter validator;
public CustomCollectionValidator() {
this.validator = new SpringValidatorAdapter(
Validation.buildDefaultValidatorFactory().getValidator()
);
}
@Override
public boolean supports(Class clazz) {
return true;
}
@Override
public void validate(Object target, Errors errors) {
if(target instanceof Collection){
Collection collection = (Collection) target;
for (Object object : collection) {
validator.validate(object, errors);
}
} else {
validator.validate(target, errors);
}
}
}
그리고 Controller에서 인자로 BindingResult를 추가하고
customCollectionValidator.validate(itemSaveRequestDtos, bindingResult);
if(bindingResult.hasErrors()) {
throw new BindException(bindingResult);
}
@Valid 어노테이션이 아닌 커스텀한 Validator를 사용하여 직접 유효성 검사를 수행하면 Collection 내의 각 Object들에 대한 유효성 검사가 이루어지고 잘못된 요청일 경우 400 에러가 응답으로 내려간다.
'Springboot' 카테고리의 다른 글
[Spring, JPA] PK의 auto_increment가 범위를 벗어날 경우 (0) | 2020.05.18 |
---|---|
Jsoup으로 크롤링하기 (0) | 2020.04.12 |
Spring Validation Annotation 총정리 (0) | 2020.01.14 |
HTTP Method - PUT, PATCH 차이점 (0) | 2019.10.22 |
생성시간, 수정시간 자동화(JPA Auditing) (0) | 2019.10.22 |
댓글