[SPRING] 스프링 MVC - 날짜 필드 바인딩
SPRING스프링 MVC - 날짜 필드 바인딩
문자열, 숫자 및 부울 값을 나타내는 요청 매개 변수의 경우 Spring MVC 컨테이너는 해당 값을 입력 된 속성에 즉시 바인딩 할 수 있습니다.
스프링 MVC 컨테이너는 Date를 나타내는 요청 매개 변수를 어떻게 바인딩합니까?
Spring MVC는 주어진 요청 매개 변수의 유형을 어떻게 결정합니까?
감사!
해결법
-
==============================
1.Spring은 ServletRequestDataBinder를 사용하여 값을 바인딩합니다. 이 프로세스는 다음과 같이 설명 할 수 있습니다.
Spring은 ServletRequestDataBinder를 사용하여 값을 바인딩합니다. 이 프로세스는 다음과 같이 설명 할 수 있습니다.
/** * Bundled Mock request */ MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter("name", "Tom"); request.addParameter("age", "25"); /** * Spring create a new command object before processing the request * * By calling <COMMAND_CLASS>.class.newInstance(); */ Person person = new Person();
...
/** * And Then with a ServletRequestDataBinder, it bind the submitted values * * It makes use of Java reflection To bind its values */ ServletRequestDataBinder binder = ServletRequestDataBinder(person); binder.bind(request);
뒤에서 DataBinder 인스턴스는 내부적으로 명령 객체의 값을 설정하는 BeanWrapperImpl 인스턴스를 사용합니다. getPropertyType 메소드를 사용하여 속성 유형을 검색합니다.
위의 요청을 보았다면 (물론 모의를 사용하여) Spring은
BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person); Clazz requiredType = beanWrapper.getPropertyType("name");
그리고
beanWrapper.convertIfNecessary("Tom", requiredType, methodParam)
사용자에게 친숙한 데이터 변환이 필요한 경우에는 PropertyEditor를 등록해야합니다. 예를 들어, java.util.Date는 13/09/2010을 모릅니다. 따라서 Spring에 알립니다.
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { public void setAsText(String value) { try { setValue(new SimpleDateFormat("dd/MM/yyyy").parse(value)); } catch(ParseException e) { setValue(null); } } public String getAsText() { return new SimpleDateFormat("dd/MM/yyyy").format((Date) getValue()); } });
convertIfNecessary 메소드를 호출하면 Spring은 제출 된 값을 변환하는 등록 된 PropertyEditor를 찾습니다. PropertyEditor를 등록하려면 다음 중 하나를 수행하십시오.
봄 3.0
@InitBinder public void binder(WebDataBinder binder) { // as shown above }
구식 스프링 2.x
@Override public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { // as shown above }
-
==============================
2.Arthur의 완벽한 답을 보완하기 위해 간단한 Date 필드의 경우 PropertyEditor 전체를 구현할 필요가 없습니다. 사용할 날짜 형식을 단순히 전달하는 CustomDateEditor를 사용할 수 있습니다.
Arthur의 완벽한 답을 보완하기 위해 간단한 Date 필드의 경우 PropertyEditor 전체를 구현할 필요가 없습니다. 사용할 날짜 형식을 단순히 전달하는 CustomDateEditor를 사용할 수 있습니다.
//put this in your Controller //(if you have a superclass for your controllers //and want to use the same date format throughout the app, put it there) @InitBinder private void dateBinder(WebDataBinder binder) { //The date format to parse or output your dates SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); //Create a new CustomDateEditor CustomDateEditor editor = new CustomDateEditor(dateFormat, true); //Register it as custom editor for the Date type binder.registerCustomEditor(Date.class, editor); }
from https://stackoverflow.com/questions/3705282/spring-mvc-binding-a-date-field by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 기반 SockJS / STOMP 웹 소켓이있는 JSON 웹 토큰 (JWT) (0) | 2018.12.16 |
---|---|
[SPRING] 클러스터 환경에서 실행되는 Spring Scheduled Task (0) | 2018.12.16 |
[SPRING] 다른 익명의 CacheManager는 이미 동일한 VM에 존재합니다 (ehCache 2.5). (0) | 2018.12.16 |
[SPRING] @Transactional 어노테이션은 인터페이스 정의 나 구현 클래스에서 어디에 넣어야합니까? (0) | 2018.12.16 |
[SPRING] Spring 4.x / 3.x (Web MVC) REST API 및 JSON2 Post 요청은 모든 요청을 한 번 올바르게 가져 오는 방법을 알려줍니다. (0) | 2018.12.16 |