만약 에러가 발행한다면, BindingResult 객체를 사용하면 해당 에러를 controller가 처리할 수 있다.
@InitBinder
public void toDate(WebDataBinder binder) { //메서드 이름은 아무거나 파라미터만 WebDataBinder로
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, "birth", new CustomDateEditor(df, false));
//binder에 커스텀 변환기 등록, Date클래스로 변환, CustomDateEditor에 형식만 지정하여 등록
//false: 빈 값을 허용할 것이냐?
}
1. Converter
- **단방향 타입 변환**
- **PropertyEditor의 단점을 개선**(stateful → stateless)
2. ConversionService
- custom converter를 ConversionService에 등록하고, ConversionService에서 자동으로 타입변환해줌
- 이미 많은 converter들이 등록되어있다.(WebDataBinder에 DefaultFormattingConversionService이 기본 등록되어 있어서 자동으로 타입변환이 이루어지고 있다)
타입 변환 우선순위(WebDataBinder에 등록 가능하거나 이미 등록된 것 중)
public interface Validator {
boolean supports(Class<?> clazz);
//객체가 검증 가능한지 알려주는 메서드
//결과가 false이면 검증 불가
void validate(@Nullable Object target, Errors errors);
//객체를 검증하는 메서드
//target-검증할 객체, errors-검증시 발생한 에러 저장소, BindingResult(interface)의 부모
}
//직접 validator 생성, 호출
UserValidator userValidator = new UserValidator();
userValidator.validate(user, result);
if(result.hasErrors()){
return "registerForm"; //<form:errors>로 jsp페이지에서 에러 출력가능
}
@InitBinder
public void toDate(WebDataBinder binder){
...
binder.setValidator(new UserValidator());
}
@PostMapping("/register/add")
public String save(Model m, @Valid User user, BindingResult result){
if(result.hasErrors()){
return "registerForm";
}
}
<annotation-driven validator="globalValidator"/>
<beans:bean id="globalValidator" class="com.fastcampus.ch22.GlobalValidator"/>
//servlet-context.xml
@PostMapping("/register/add")
public String save(Model m, @Valid User user, BindingResult result){
if(result.hasErrors()){
return "registerForm";
}
}
<annotation-driven validator="globalValidator"/>
<beans:bean id="globalValidator" class="com.fastcampus.ch22.GlobalValidator"/>
//servlet-context.xml
@InitBinder
public void toDate(WebDataBinder binder){
...
binder.addValidators(new UserValidator());
//set이 아닌 add!!
//local Validator를 추가
}
<form:form action="submit" method="post" modelAttribute="welcome">
<table>
<tr>
<td><form:label path="name">Full Name: </form:label></td>
<td><form:input path="name" />
<form:errors path="name" cssStyle="color:red"/></td>
</tr>
...
<form id="welcome" action="submit" method="post">
<table>
<tr>
<td><label for="name">Full Name: </label></td>
<td><input id="name" name="name" type="text" value=""/>
<span id="name.errors" style="color:red">Please enter your name.</span></td>
</tr>
<form:errors path="name" cssStyle="color:red"/>
<span id="name.errors" style="color:red">Please enter your name.</span>
//실행시 위에서 아래로 변환됨
이 게시글은 남궁성 강사님의 스프링의 정석 강의를 요약, 정리 및 보충한 글입니다.