URL 로 들어오는 Map은 모두 String 처리 되어 있다 .
MyDate 클래스로 타입변환을 하여 데이터를 넣어준다.
@InitBinder
public void toDate(WebDataBinder binder) {
binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor("#"));
binder.registerCustomEditor(String[].class, "hobby" , new StringArrayPropertyEditor("#")); // 특정 타입 이나 이름 ("hobby") 에만 적용가능
}
모든 컨드롤러 내에서의 변환 : WebBindingInitializer
구현
특정 컨트롤러 내에서의 변환 : 컨트롤러 안에 @InitBinder
가 붙은 메서드 작성
단점 : stateful
stateful : 인스턴스변수 사용 ( 싱글톤 사용x = 변환할 때 마다 새로운 객체 계속 생성해야 함 )
ConfigurableWebBindingInitializer
설정@InitBinder
가 붙은 메서드 작성 public class StringToStringArrayConverter implements Converter(< String , String[] >) // String -> String[]로 변환
@Override
public String[] convert(String source){
return source.split("#"); // String -> String[]
}
@NumberFormat
, @DateTimeFormat
사용public interface Formatter<T> extends Printer<T> , Parser<T>{ }
public interface Printer<T>{
String print(T object , Locale locale); // Object -> String
}
public interface Parse<T>{
T parse(String text , Locale locale) throws ParseException; // String -> Object
}
내부에서 에러나 결과를 Controller에 담기도록 한다.
BindingResult
는 값을 전달받을때 , 에러가 포함된 변수의 뒤쪽에 위치하여 에러가 있는 상태를 Controller가 처리 하도록 한다.
@PostMapping("/register/save")
public String save(User user, BindingResult result, Model m) throws Exception {
}
Date 타입은 yyyy/mm/dd
로 표준 형식으로 넘겨주어야 하지만, yyyy-mm-dd
로 입력 형태를 바꿔주려고 한다.
@InitBinder
public void toDate(WebDataBinder binder) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); //입력 형식 지정
binder.registerCustomEditor(Date.class, new CustomDateEditor(df,false)); // Date 타입
}
InitBinder 내부 2줄 대신 사용
public class User {
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birth;
}
public class User {
private String[] hobby;
private String[] sns;
}
입력을 tennis#swim#soccer
이런식으로 들어오면 [tennis , swim , soccer]
이런식으로 변환해줌
@InitBinder
public void toDate(WebDataBinder binder) {
binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor("#")); //들어오는 String[] "#" 기준으로 분리
}