TypeConverter类型转换

前不久在Spring的SimpleTypeConverter基础上扩展实现了我想要的对象类型的转换,当然前提是他们能够互转,一般我们不会要求把"abc"转成数字的吧。

下面是spring支持的一些基本的类型转换:
Integer <-> String
Boolean <-> String
Long    <-> String
Long    <-> Integer
...

在这个基础上扩展了日期与字符串、日期与long、util.Date与sql.Date互转,代码如下:
public class CustomDateEditor extends PropertyEditorSupport {

    private DateFormat formatter;

    public CustomDateEditor(String dateFormat) {
        this.formatter = new SimpleDateFormat(dateFormat);
    }

    /**
     * <pre>
     * 对象转日期
     * java.sql.Date -> java.util.Date
     * String -> java.util.Date
     * Long -> java.util.Date
     * Calandar -> java.util.Date
     * </pre>
     */
    @Override
    public void setValue(Object o) {
        if (o instanceof java.sql.Date) {
            super.setValue(new Date(((java.sql.Date) o).getTime()));
        } else if (o instanceof String) {
            setAsText((String) o);
        } else if (o instanceof Long) {
            super.setValue(new Date((Long) o));
        } else if (o instanceof Calendar) {
            super.setValue(((Calendar) o).getTime());
        } else {
            super.setValue(o);
        }
    }

    /**
     * 字符串转日期
     */
    @Override
    public void setAsText(String dateStr) {
        if (dateStr != null) {
            try {
                super.setValue(formatter.parse(dateStr));
            } catch (ParseException e) {
                throw new IllegalArgumentException("Could not parse date: " + e.getMessage());
            }
        } else {
            super.setValue(null);
        }
    }

    /**
     * 日期转字符串
     */
    public String getAsText() {
        Object v = this.getValue();
        return v == null ? "" : formatter.format((Date) v);
    }
}


public class CustomSqlDateEditor extends PropertyEditorSupport {

    private DateFormat formatter;

    public CustomSqlDateEditor(String dateFormat) {
        this.formatter = new SimpleDateFormat(dateFormat);
    }

    /**
     * 对象转sql.Date
     */
    @Override
    public void setValue(Object o) {
        if (o instanceof java.util.Date) {
            super.setValue(new Date(((java.util.Date) o).getTime()));
        } else if (o instanceof String) {
            setAsText((String) o);
        } else if (o instanceof Long) {
            super.setValue(new Date((Long) o));
        } else if (o instanceof Calendar) {
            super.setValue(new Date(((Calendar) o).getTimeInMillis()));
        } else {
            super.setValue(o);
        }
    }

    /**
     * 字符串转sql.Date
     */
    @Override
    public void setAsText(String dateStr) {
        if (dateStr != null) {
            try {
                super.setValue(new Date(formatter.parse(dateStr).getTime()));
            } catch (ParseException e) {
                throw new IllegalArgumentException("Could not parse date: " + e.getMessage());
            }
        } else {
            setValue(null);
        }
    }

    /**
     * sql.Date转字符串
     */
    public String getAsText() {
        Object v = this.getValue();
        return v == null ? "" : formatter.format((Date) v);
    }
}


再将我们定制的editor注册到converter中,从而定制自己的类型转换方式。

你可能感兴趣的:(java,spring,sql)