BeanUtils工具类中,有很多有用的方法可以取得对象的属性值(如getProperty),而返回值是String类型,对于一些属性类型,默认的返回值并不是我们想要的格式,如对象有一个Date属性,如果不做处理,默认取得的值将是Wed Oct 24 14:00:57 CST 2012这样的格式。

BeanUtils默认在包org\apache\commons\beanutils\converters定义了一系列的Converter对对象属性值进行转换。

AbstractArrayConverter.java
AbstractConverter.java
ArrayConverter.java
BigDecimalConverter.java
BigIntegerConverter.java
BooleanArrayConverter.java
BooleanConverter.java
ByteArrayConverter.java
ByteConverter.java
CalendarConverter.java
CharacterArrayConverter.java
CharacterConverter.java
ClassConverter.java
ConverterFacade.java
DateConverter.java
DateTimeConverter.java
DoubleArrayConverter.java
DoubleConverter.java
FileConverter.java
FloatArrayConverter.java
FloatConverter.java
IntegerArrayConverter.java
IntegerConverter.java
LongArrayConverter.java
LongConverter.java
NumberConverter.java
package.html
ShortArrayConverter.java
ShortConverter.java
SqlDateConverter.java
SqlTimeConverter.java
SqlTimestampConverter.java
StringArrayConverter.java
StringConverter.java
URLConverter.java


可以自己定义converter,只要实现Converter接口或者继承AbstractConverter类
如:
public class MyDateConverter implements Converter{
    @Override
     public Object convert(Class class1, Object obj) {
        SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd");
         return sdf.format((Date)obj);
    }
  }


使用时注册到BeanUtils中
BeanUtilsBean.setInstance( new BeanUtilsBean2());
    MyDateConverter converter1 = new MyDateConverter();
    ConvertUtils.register(converter1, Date. class);
    System.out.println(BeanUtils.getProperty(test, "date"));

或者使用默认的DateConverter,指定日期格式:
BeanUtilsBean.setInstance( new BeanUtilsBean2());
    DateConverter converter = new DateConverter();
    converter.setPattern( "yyyy/MM/dd");
    ConvertUtils.register(converter, Date. class);
    System.out.println(BeanUtils.getProperty(test, "date"));

(例子见附件)

这里须注意的是 BeanUtilsBean.setInstance(new BeanUtilsBean2()); 在旧版本中,BeanUtils在取值时并不会根据属性的类型使用各种各样的Converter去取值,而是使用默认的StringConverter,而StringConverter最后只是返回属性的toString值,如下:

BeanUtilsBean源码中:
public String getNestedProperty(Object bean, String name)
                         throws IllegalAccessException, InvocationTargetException,
                        NoSuchMethodException {

                Object value = getPropertyUtils().getNestedProperty(bean, name);
                 return (getConvertUtils().convert(value));

        }

ConverterUtilsBean源码:
public String convert(Object value) {

                 if (value == null) {
                         return null;
                } else if (value.getClass().isArray()) {
                         if (Array.getLength(value) < 1) {
                                 return ( null);
                        }
                        value = Array.get(value, 0);
                         if (value == null) {
                                 return null;
                        } else {
                                Converter converter = lookup(String. class);
                                 return ((String) converter.convert(String. class, value));
                        }
                } else {
                         Converter converter = lookup(String.class);
                         return ((String) converter.convert(String. class, value));
                }

        }

由上面源码可以看到,在旧版本中,默认是使用 StringConverter转换器,而StringConverter只是简单的toString处理:

protected Object convertToType(Class type, Object value) throws Throwable {
                 return value.toString();
        }


在BeanUtils1.8版本以后增加了BeanUtilsBean2及ConverUtilsBean2两个类可以根据对象属性的类型使用不同的Converter(在初始化时,把类型及Converter放到一个Map中,使用时再根据类型取得Converter,之所以增加两个类是避免影响之前 的版本)。

ConverterUtilsBean2相关源码:
public String convert(Object value) {
                 return (String)convert(value, String. class);
        }

调用到ConverterUtilsBean源码:

public Object convert(Object value, Class targetType) {
.....
Object converted = value;
                Converter converter = lookup(sourceType, targetType);
             .....
}