복붙노트

[SPRING] 스프링 MVC - 날짜 필드 바인딩

SPRING

스프링 MVC - 날짜 필드 바인딩

문자열, 숫자 및 부울 값을 나타내는 요청 매개 변수의 경우 Spring MVC 컨테이너는 해당 값을 입력 된 속성에 즉시 바인딩 할 수 있습니다.

스프링 MVC 컨테이너는 Date를 나타내는 요청 매개 변수를 어떻게 바인딩합니까?

Spring MVC는 주어진 요청 매개 변수의 유형을 어떻게 결정합니까?

감사!

해결법

  1. ==============================

    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. ==============================

    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);
    }
    
  3. from https://stackoverflow.com/questions/3705282/spring-mvc-binding-a-date-field by cc-by-sa and MIT license