Spring MVC - Validator 커스터마이징

2020. 9. 20. 21:18Java/Spring

반응형

Validator 인터페이스 구현

- 먼저 Validator 인터페이스를 구현해야 한다.

- supports : 유효성 검사할 데이터를 가지고 있는 객체가 유효성 검사가 가능한지 확인한다.

- validate : 유효성 검사를 하는 메서드

 

 

패키지를 하나 생성하여 다음과 같은 클래스를 만든다.

public class DataBeanValidator 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) {
		// TODO Auto-generated method stub

	}

}

 


Validator를 컨트롤러에서 등록

 

- Validator를 컨트롤러에서 등록해준다.

- 사용할 Validator가 하나면 setValidator, 한 개 이상이면 addValidators 메서드를 사용한다.

 

다음 메소드를 controller에 등록한다.

@InitBinder
public void initBinder(WebDataBinder binder) {
	DataBeanValidator validator1 = new DataBeanValidator();
	binder.addValidators(validator1);//여러개 주입 가능
}

ValidateUtils

- 지정된 값에 대해 유효성 검사를 하는 메서드

- rejectIfEmpty(error객체, “프로퍼티이름, “코드이름“) : 값이 비어 있는지 확인합니다. 공백은 글자로 취급한다.

- rejectIfEmptyOrWhitespace(error객체, “프로퍼티이름, “코드이름“) : 값이 비어 있거나 공백으로만 구성되어 있는지 확인한다.

- 입력값에 문제가 있다면 error 객체에 오류정보를 저장합니다. 사용할 오류 메시지는 코드이름.bean객체이름.프로퍼티이름으로 구성된다.

 

다음과 같이 수정한다.

public class DataBeanValidator 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) {
		ValidationUtils.rejectIfEmpty(errors, "data1", "error1");
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "data2", "error2");
	}

}

target에 controller에서 valid로 주입된 객체의 주소값이 주입된다.

 

위 코드처럼 설정시 target에 들어온 객체의 data1의 값이 비어있으면 error1을 출력하고, 

data2의 값을 공백을 모두 제거하고 길이가 0이면 error2를 출력한다.

 

위 에러 메세지는 아래와 같이 접근하여 properties에서 수정 가능하다.

 


rejectValue

 

- 유효성 조건을 직접 만들어 검사할 때 사용한다.

- If문으로 유효성 검사를 해주고 위배시 rejectValue를 통해 오류 정보를 지정한다.

- rejectValue( “프로퍼티이름, “코드이름“)

- 입력값에 문제가 있다면 error 객체에 오류정보를 저장합니다. 사용할 오류 메시지는 코드이름.bean객체이름.프로퍼티이름으로 구성된다.

 

 

아래와 같이 메소드를 변경한다.

public class DataBeanValidator 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) {
		ValidationUtils.rejectIfEmpty(errors, "data1", "error1");
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "data2", "error2");
	
		DataBean1 bean1 = (DataBean1)target;
		
		String data1 = bean1.getData1();
		String data2 = bean1.getData2();
		
		if(data1.length()>10) {
			errors.rejectValue("data1","error3");
		}
		if(data2.contains("@") == false) {
			errors.rejectValue("data2","error4");
		}
	}

}

bean객체에서 값을 꺼내와서 조건을 주고, error를 설정한다.

이 역시 properties에서 설정 가능하다.

 

반응형