org.springframework.validation.Databinder
Property 값을 타겟 객체에 설장하는 기능이다.
사용자의 입력 값을 Model 값에 동적으로 변환해서 넣어주는 기능이다.
사용자가 입력하는 값은 대부분 문자열, 숫자 일 것이다. 그 값을 객체가 가지고 있는 속성 타입이나 도메인 타입으로 변환해서 넣어주기 위해 사용한다.
@RestController
public class EventController {
@InitBinder
public void init(WebDataBinder webDataBinder){
webDataBinder.registerCustomEditor(Event.class, new EventEditor());
}
@GetMapping("/event/{event}")
public String getEvent(@PathVariable Event event){
System.out.println("event = " + event);
return event.getId().toString();
}
}
// Thread-Safe 하지 않는다.
// 절대로 proportyEditor 절대로 싱글톤 빈으로 등록해서 사용하면 안됨
// thread-scope의 빈 일 경우에는 그나마 가능
public class EventEditor extends PropertyEditorSupport {
@Override
public String getAsText() {
Event event = (Event) getValue();
return event.getId().toString();
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(new Event(Integer.parseInt(text)));
}
}
public class EventConverter {
@Component
public static class StringToEventConverter implements Converter<String, Event> {
@Override
public Event convert(String source) {
return new Event(Integer.parseInt(source));
}
}
@Component
public static class EventtoStringConverter implements Converter<Event, String> {
@Override
public String convert(Event source) {
return source.getId().toString();
}
}
}
@Component
public class EventFormatter implements Formatter<Event> {
@Override
public Event parse(String text, Locale locale) throws ParseException {
return new Event(Integer.parseInt(text));
}
@Override
public String print(Event object, Locale locale) {
return object.getId().toString();
}
}
ConversionService
에서 Converter
와 Formatter
를 등록해준다.DefaultFormattingConversionService
클래스에서 FormatterRegistry
, ConversionService
인터페이스를 다 구현한다.DefaultFormattingVonversionService
를 상속하여 만든 WebConversionService
를 빈으로 등록해준다.@Component
public class AppRunner implements ApplicationRunner {
@Autowired
private ConversionService conversionService;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(conversionService);
}
}
@WebMvcTest({EventFormatter.class, EventController.class})
와 같이 Bean으로 등록된 클래스들을 추가하여 테스트 할 수 있다.