-
스프링4.0 - @Valid / @InitBinder 검증 & 글로벌 Validator웹프로그래밍/spring 2018. 7. 17. 23:03
@Valid / @InitBinder 검증
JSR 303 표준에 정의된 @Valid으로 커맨드 객체를 검사하는 코드를 직접 호출하지 않고 스프링 프레임워크가 호출하도록 설정한다.
1. 의존 설정 추가
-pom.xml
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
2.컨트롤러 클래스에서 @Valid / @InitBinder 사용
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/auth/login")
public class LoginController {
private static final String LOGIN_FORM = "auth/loginForm";
private Authenticator authenticator;
@RequestMapping(method = RequestMethod.GET)
public String loginForm(LoginCommand loginCommand) {
return LOGIN_FORM;
}
@RequestMapping(method = RequestMethod.POST)
//@Valid으로 validate()메서드 호출을 대신한다.
public String login(@Valid LoginCommand loginCommand, Errors errors,
HttpServletRequest request) {
//Errors: Stores and exposes information about data-binding and validation errors for a specific object.
if (errors.hasErrors()) {
return LOGIN_FORM;
}
try {
//Auth 자바빈
Auth auth = authenticator.authenticate(loginCommand.getEmail(), loginCommand.getPassword());
//세션 객체 생성
HttpSession session = request.getSession();
//authenticate()에서 리턴 받은 id와 name을 세션에 저장
session.setAttribute("auth", auth);
return "redirect:/index.jsp";
} catch (AuthenticationException ex) {
errors.reject("invalidIdOrPassword");
return LOGIN_FORM;
}
}
//validation 클래스를 initBinder()의 setValidator()로 지정한다.
//입력 폼과 커맨드 객체의 맵핑을 처리하는 WebDataBinder를 초기화한다.
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new LoginCommandValidator());
}
//sample.xml에서 DI 프로퍼티 수동 연결되어 있으므로 set메서드로 Authenticator 객체를 가져온다.
public void setAuthenticator(Authenticator authenticator) {
this.authenticator = authenticator;
}
}
3. 뷰 단에서 에러 메시지 출력
<form:form commandName="loginCommand">
<form:errors element="div" />
<label for="email">이메일</label>:
<input type="text" name="email" id="email" value="${loginCommand.email}">
<form:errors path="email"/> <br>
글로벌 Validator
한 개의 Validator로 모든 커맨드 객체를 검증한다.
1. xml설정 추가
<annotation-driven validator="validator"/>
<bean id="" class=""/>
2. 컨트롤러 클래스에서 @Vailid 추가
글로벌 Validator는 @Vailid가 붙은 커맨드 객체만 검증한다.
public String login(@Valid LoginCommand loginCommand, Errors errors,
HttpServletRequest request) {
a. 글로벌 Validator 대신 다른 Validator를 사용하려면
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new LoginCommandValidator());
}
b. 글로벌 Validator에 다른 Validator를 추가하려면 addValidator()
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidator(new LoginCommandValidator());
}
'웹프로그래밍 > spring' 카테고리의 다른 글
스프링 4.0 - 정적 자원 설정하기 (ex. 이미지파일 경로 맵핑) (0) 2018.07.18 스프링4.0- 익셉션 처리 (0) 2018.07.18 스프링4.0 - Validator / Errors / BindingResult로 객체 검증 : 에러 메시지 (0) 2018.07.17 스프링4.0 - AOP : @Aspect 기반 (0) 2018.07.16 스프링4.0 - AOP 기초 (0) 2018.07.15