Tuesday, February 1, 2011

Data binding in Spring MVC

Property editors can be used to bind String to various data types in Spring MVC. Here, enum, int and Date bindings are described.

  • Enum Type

EnumEditor:

import java.beans.PropertyEditorSupport;

@SuppressWarnings("unchecked")
public class EnumEditor extends PropertyEditorSupport {
 private Class clazz;

 public EnumEditor(Class clazz) {
  this.clazz = clazz;
 };

 public String getAsText() {
  return (getValue() == null ? "" : ((Enum) getValue()).name());
 }

 public void setAsText(String text) throws IllegalArgumentException {
  setValue(Enum.valueOf(clazz, text));
 }

EnumClass:

public enum EnumClass{
    RED, GREEN, BLUE
}

Register in controller:

@InitBinder
 public void initBinder(WebDataBinder binder) {
 
  binder.registerCustomEditor(EnumClass.class,
    new EnumEditor(EnumClass.class));
 }

  • Int Type
IntEditor:

import java.beans.PropertyEditorSupport;
@SuppressWarnings("unchecked")
public class IntEditor extends PropertyEditorSupport {

    private Class clazz;

       public IntEditor(Class clazz) {
           this.clazz = clazz;
       }

    public String getAsText() {
        Integer value = (Integer) getValue();
        if (value.intValue() == 0) {
            return "";
        } else {
            return value.toString();
        }
    }

    public void setAsText(String value) {
        if (value != null && value.length() > 0) {
            setValue(Integer.parseInt(value));
        } else {
            setValue(0);
        }
    }

Register in controller:

@InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(int.class, new IntEditor(int.class));
    }

  • Date Type
DateEditor:

@SuppressWarnings("rawtypes")
public class DateEditor extends PropertyEditorSupport {
    private Class clazz;

    public DateEditor(Class clazz) {
        this.clazz = clazz;
    }

    public void setAsText(String value) {
        try {
          setValue(new SimpleDateFormat("yyyy-MM-dd").parse(value));
           
        } catch (ParseException e) {
            setValue(null);
        }
    }

    public String getAsText() {
        return new SimpleDateFormat("yyyy-MM-dd hh:mm a").format((Date) getValue());
    }

    public void setClazz(Class clazz) {
        this.clazz = clazz;
    }

    public Class getClazz() {
        return clazz;
    }
}

Register in controller:

@InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Date.class, new DateEditor(Date.class));
       
    }

No comments:

Post a Comment