Close

Spring - Use of PropertyEditors via BeanWrapper

[Last Updated: Dec 22, 2023]

BeanWrapperImpl internally registers most of the Spring's built-in PropertyEditors (see the complete list in last tutorial) That means that type conversion can happen not only in Spring IoC container, by even outside of Spring container, by the simple use of BeanWrapper.

Examples

Following example shows, how BeanWrapper does auto type conversion from string to Date.

package com.logicbig.example;

import java.util.Date;

public class Person {
  private String name;
  private Date dateOfBirth;

  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public Date getDateOfBirth() {
      return dateOfBirth;
  }

  public void setDateOfBirth(Date dateOfBirth) {
      this.dateOfBirth = dateOfBirth;
  }

  @Override
  public String toString() {
      return "Person{" +
              "name='" + name + '\'' +
              ", dateOfBirth=" + dateOfBirth +
              '}';
  }
}
package com.logicbig.example;

import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.time.ZoneId;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;

public class PersonBeanWrapperExample {
  public static void main(String[] args) {
      Person person = new Person();
      BeanWrapper bw = new BeanWrapperImpl(person);
      bw.setPropertyValue("name", "Tim");
      bw.setPropertyValue("dateOfBirth", "Thu Jul 01 16:18:19 CDT 2021");
      System.out.println(person);
      System.out.println(person.getDateOfBirth().toInstant()
                               .atZone(ZoneId.systemDefault()).toLocalDate());
  }
}

Output

Person{name='Tim', dateOfBirth=Thu Jul 01 16:18:19 CDT 2021}
2021-07-01

Registering Custom editor with BeanWrapperImpl

package com.logicbig.example;

import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PersonBeanWrapperExample2 {
  public static void main(String[] args) {
      Person person = new Person();
      BeanWrapperImpl beanWrapper= new BeanWrapperImpl(person);

      CustomDateEditor dateEditor = new CustomDateEditor(
              new SimpleDateFormat("yyyy-MM-dd"), true);
      beanWrapper.registerCustomEditor(Date.class, dateEditor);

      beanWrapper.setPropertyValue("name", "Tim");
      beanWrapper.setPropertyValue("dateOfBirth", "1984-07-10");

      System.out.println(person);
  }
}

Output

Person{name='Tim', dateOfBirth=Tue Jul 10 00:00:00 CDT 1984}

Creating new property editor

package com.logicbig.example;

import org.springframework.beans.BeanWrapperImpl;
import java.beans.PropertyEditorSupport;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class LocalDateEditorExample {

    public static void main(String[] args) {
        Person person = new Person();
        BeanWrapperImpl bw = new BeanWrapperImpl(person);
        bw.registerCustomEditor(LocalDate.class,
                new LocalDateEditor(DateTimeFormatter.ofPattern("yyyy/MM/dd")));
        bw.setPropertyValue("name", "Tim");
        bw.setPropertyValue("dateOfBirth", "1984/07/06");
        System.out.println(person);
    }

    private static class Person{
        private String name;
        private LocalDate dateOfBirth;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public LocalDate getDateOfBirth() {
            return dateOfBirth;
        }

        public void setDateOfBirth(LocalDate dateOfBirth) {
            this.dateOfBirth = dateOfBirth;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", dateOfBirth=" + dateOfBirth +
                    '}';
        }
    }

    public static class LocalDateEditor extends PropertyEditorSupport {
        private final DateTimeFormatter formatter;

        public LocalDateEditor(DateTimeFormatter formatter) {
            this.formatter = formatter;
        }

        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            setValue(LocalDate.parse(text,  formatter));
        }

        @Override
        public String getAsText() {
            return getValue().toString();
        }
    }
}

Output

Person{name='Tim', dateOfBirth=1984-07-06}

Accessing default PropertyEditor

Following example shows that we can access a default PropertyEditor via BeanWrapperImpl, even without wrapping an object.

package com.logicbig.example;

import org.springframework.beans.BeanWrapperImpl;
import java.beans.PropertyEditor;
import java.util.Currency;

public class PropertyEditorAccessExample {

  public static void main (String[] args) {
      BeanWrapperImpl wrapper = new BeanWrapperImpl();
      PropertyEditor editor = wrapper.getDefaultEditor(Currency.class);
      editor.setAsText("MYR");
      Currency value = (Currency) editor.getValue();
      System.out.println(value.getDisplayName());
  }
}

Output

Malaysian Ringgit

Example Project

Dependencies and Technologies Used:

  • spring-context 6.1.2 (Spring Context)
     Version Compatibility: 3.2.3.RELEASE - 6.1.2Version List
    ×

    Version compatibilities of spring-context with this example:

    • 3.2.3.RELEASE
    • 3.2.4.RELEASE
    • 3.2.5.RELEASE
    • 3.2.6.RELEASE
    • 3.2.7.RELEASE
    • 3.2.8.RELEASE
    • 3.2.9.RELEASE
    • 3.2.10.RELEASE
    • 3.2.11.RELEASE
    • 3.2.12.RELEASE
    • 3.2.13.RELEASE
    • 3.2.14.RELEASE
    • 3.2.15.RELEASE
    • 3.2.16.RELEASE
    • 3.2.17.RELEASE
    • 3.2.18.RELEASE
    • 4.0.0.RELEASE
    • 4.0.1.RELEASE
    • 4.0.2.RELEASE
    • 4.0.3.RELEASE
    • 4.0.4.RELEASE
    • 4.0.5.RELEASE
    • 4.0.6.RELEASE
    • 4.0.7.RELEASE
    • 4.0.8.RELEASE
    • 4.0.9.RELEASE
    • 4.1.0.RELEASE
    • 4.1.1.RELEASE
    • 4.1.2.RELEASE
    • 4.1.3.RELEASE
    • 4.1.4.RELEASE
    • 4.1.5.RELEASE
    • 4.1.6.RELEASE
    • 4.1.7.RELEASE
    • 4.1.8.RELEASE
    • 4.1.9.RELEASE
    • 4.2.0.RELEASE
    • 4.2.1.RELEASE
    • 4.2.2.RELEASE
    • 4.2.3.RELEASE
    • 4.2.4.RELEASE
    • 4.2.5.RELEASE
    • 4.2.6.RELEASE
    • 4.2.7.RELEASE
    • 4.2.8.RELEASE
    • 4.2.9.RELEASE
    • 4.3.0.RELEASE
    • 4.3.1.RELEASE
    • 4.3.2.RELEASE
    • 4.3.3.RELEASE
    • 4.3.4.RELEASE
    • 4.3.5.RELEASE
    • 4.3.6.RELEASE
    • 4.3.7.RELEASE
    • 4.3.8.RELEASE
    • 4.3.9.RELEASE
    • 4.3.10.RELEASE
    • 4.3.11.RELEASE
    • 4.3.12.RELEASE
    • 4.3.13.RELEASE
    • 4.3.14.RELEASE
    • 4.3.15.RELEASE
    • 4.3.16.RELEASE
    • 4.3.17.RELEASE
    • 4.3.18.RELEASE
    • 4.3.19.RELEASE
    • 4.3.20.RELEASE
    • 4.3.21.RELEASE
    • 4.3.22.RELEASE
    • 4.3.23.RELEASE
    • 4.3.24.RELEASE
    • 4.3.25.RELEASE
    • 4.3.26.RELEASE
    • 4.3.27.RELEASE
    • 4.3.28.RELEASE
    • 4.3.29.RELEASE
    • 4.3.30.RELEASE
    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.2.16.RELEASE
    • 5.2.17.RELEASE
    • 5.2.18.RELEASE
    • 5.2.19.RELEASE
    • 5.2.20.RELEASE
    • 5.2.21.RELEASE
    • 5.2.22.RELEASE
    • 5.2.23.RELEASE
    • 5.2.24.RELEASE
    • 5.2.25.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8
    • 5.3.9
    • 5.3.10
    • 5.3.11
    • 5.3.12
    • 5.3.13
    • 5.3.14
    • 5.3.15
    • 5.3.16
    • 5.3.17
    • 5.3.18
    • 5.3.19
    • 5.3.20
    • 5.3.21
    • 5.3.22
    • 5.3.23
    • 5.3.24
    • 5.3.25
    • 5.3.26
    • 5.3.27
    • 5.3.28
    • 5.3.29
    • 5.3.30
    • 5.3.31
    • Compatible Java Version: 17+
    • 6.0.0
    • 6.0.1
    • 6.0.2
    • 6.0.3
    • 6.0.4
    • 6.0.5
    • 6.0.6
    • 6.0.7
    • 6.0.8
    • 6.0.9
    • 6.0.10
    • 6.0.11
    • 6.0.12
    • 6.0.13
    • 6.0.14
    • 6.0.15
    • 6.1.0
    • 6.1.1
    • 6.1.2

    Versions in green have been tested.

  • JDK 17
  • Maven 3.8.1

Use of PropertyEditors by BeanWrapper Select All Download
  • spring-property-editors-used-by-bean-wrapper
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • LocalDateEditorExample.java

    See Also