Validator
JSR-303, JSR-380 스펙을 이용한 유효성 검사 방법을 학습함.
지금까지는 유효성 검사를 하기위해 Hibernate를 사용하였습니다.
이번에는 Validator 를 직접 만들어 보도록 하겠습니다.
JSR-303 , JSR-380 스펙으로 유효성 검사를 한 후 추가적으로 다른 유효성 검사를 하고자 할 때 사용합니다.
validator 인터페이스 구현
먼저 validator인터페이스를 구현합니다
supports : 유효성 검사할 데이터를 가지고 있는 객체가 유효성 검사가 가능한지 확인합니다.(구현되있음)
validate : 유효성 검사를 하는 메서드
package kr.co.softcampus.validator;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import kr.co.softcampus.beans.DataBean1;
public class DataBean1Validator implements Validator{
@Override
public boolean supports(Class<?> clazz) {//해당 클래스가 유효성 검사가 가능한지 검사
// TODO Auto-generated method stub
return DataBean1.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {//유효성 검사를 하는곳 @valid가 붙어져있는 dataBean1의 주솟값이 target매개변수로 들어옴
// TODO Auto-generated method stub
}
}
validator를 컨트롤러에서 등록
validator를 컨트롤러에서 등록해줍니다
사용할 validator가 하나면 setValidator, 한 개 이상이면 addValidators메서드를 사용합니다
@PostMapping("/input_pro")
public String input_pro(@Valid DataBean1 dataBean1,BindingResult result) {
if(result.hasErrors()) {
return "input_data";
}
return "input_success";
}
@InitBinder
protected void initBinder(WebDataBinder binder)
{
DataBean1Validator validator1 = new DataBean1Validator();//@Valid가 붙어있는 객체의 변수의 값들을 이곳으로 넘겨서 검사함
binder.setValidator(validator1);//@Valid가 붙어있는 bean이 여러개일때 validator갯수가 늘어남..validator1,validator2..
}
validdateUtils
지정된 값에 대해 유효성 검사를 하는 메서드
rejectIfEmpty(error객체,"프로퍼티이름","코드이름"):값이 비어 있는지 확인합니다. 공백은 글자로 취급합니다.
rejectIfEmptyOrWhitespace(error객체,"프로퍼티이름","코드이름") : 값이 비어 있거나 공백으로만 구성되어 있는지 확인합니다.
입력값에 문제가 있다면 error 객체에 오류정보를 저장합니다. 사용할 오류 메시지는 "코드이름.bean객체이름.프로퍼티이름"으로 구성됩니다.
package kr.co.softcampus.validator;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import kr.co.softcampus.beans.DataBean1;
public class DataBean1Validator implements Validator{
@Override
public boolean supports(Class<?> clazz) {//해당 클래스가 유효성 검사가 가능한지 검사
// TODO Auto-generated method stub
return DataBean1.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {//유효성 검사를 하는곳 @valid가 붙어져있는 dataBean1의 주솟값이 target매개변수로 들어옴
// TODO Auto-generated method stub
ValidationUtils.rejectIfEmpty(errors, "data2","error2");//dataBean1의 data2의 변수의 값의 길이가 0이면 유효성검사 실패 0이 아니면 유효성검사 통과
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "data3", "error3");//data3의 길이가 0이거나 공백으로만 채워져있으면 에러3이라는 에러발생
}
rejectValue
유효성 조건을 직접 만들어 검사할 때 사용합니다
if문으로 유효성 검사를 해주고 위배시 rejectValue를 통해 오류 정보를 지정합니다
rejectValue("프로퍼티이름","코드이름")
입력값에 문제가 있다면 error 객체에 오류 정보를 저장합니다. 사용할 오류 메시지는 "코드이름.bean객체이름.프로퍼티이름"으로 구성됩니다
package kr.co.softcampus.validator;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import kr.co.softcampus.beans.DataBean1;
public class DataBean1Validator implements Validator{
@Override
public boolean supports(Class<?> clazz) {//해당 클래스가 유효성 검사가 가능한지 검사
// TODO Auto-generated method stub
return DataBean1.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {//유효성 검사를 하는곳 @valid가 붙어져있는 dataBean1의 주솟값이 target매개변수로 들어옴
// TODO Auto-generated method stub
ValidationUtils.rejectIfEmpty(errors, "data2","error2");//dataBean1의 data2의 변수의 값의 길이가 0이면 유효성검사 실패 0이 아니면 유효성검사 통과
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "data3", "error3");//data3의 길이가 0이거나 공백으로만 채워져있으면 에러3이라는 에러발생
DataBean1 bean1 = (DataBean1)target;
String data2=bean1.getData2();
String data3=bean1.getData3();
if(data2.length()>10) {
errors.rejectValue("data2", "error4");//dataBean1의 data2의 길이가 10보다 크면 error4.dataBean1.data2에러발생
}
if(data3.contains("@") == false)
{
errors.rejectValue("data3", "error5");//dataBean1의 data2에 @ 가없으면 error5.dataBean1.data3에러발생
}
}
}