-
[Spring] Validator 2개 이상 등록하기legacy/Spring 2023. 7. 6. 20:52
1개의 Controller에서 2개 이상의 Validator를 등록하려면 어떻게 해야 할까?
WebDataBinder의 addValidators()에 그냥 2개를 저장하면 될까? 바로 알아보자.
오류 코드
나는 회원가입용 검증기와 로그인용 검증기 2개를 등록하려고 하였다. 처음에 WebDataBinder에 2개를 바로 저장하였다.
참고로 registerValidator와 loginValidator는 주입받은 상태이다.
// Controller @InitBinder public void init(WebDataBinder webDataBinder) { webDataBinder.addValidators(registerValidator, loginValidator); }
그러나 바로 IllegalStateException 예외가 터졌다. 메서드 호출하는 것에 문제가 있는 것 같다.
내가 WebDataBinder에 2개 검증기를 넣은 이유는 다음과 같다.
addValidators() 메서드를 보면 매개변수로 가변인자를 사용하고 있고 최종적으로 List로 저장하고 있다. 그래서 나는 당연히 2개의 검증기가 List로 저장되어 적절히 사용될 줄 알았다.
// WebDataBinder 클래스 public void addValidators(Validator... validators) { assertValidators(validators); this.validators.addAll(Arrays.asList(validators)); }
정상 코드
그렇다면 어떻게 해야 할까? 정답은 2개를 동시에 저장하지 말고 메서드를 추가적으로 만들어야 한다.
주의해야 할 것은 InitBinder 애너테이션에 value 값을 적어줘야 한다. value값에 아무거나 적어도 작동하는 걸 봐서는 본인이 쓰고 싶은 대로 써도 되는 것 같다.
// Controller @InitBinder("registerValidator") public void init(WebDataBinder webDataBinder) { webDataBinder.addValidators(registerValidator); } @InitBinder("loginValidator") public void init2(WebDataBinder webDataBinder) { webDataBinder.addValidators(loginValidator); }
결론
Controller에서 2개의 Validator를 저장하려면 @InitBinder 애너테이션이 붙은 메서드를 추가적으로 만들어서 등록한다.
또한 애너테이션의 value값을 꼭! 적어줘야한다.