今天遇到一个功能需要将javabean的属性转换到map<String,String>中,想到apache commons-beanutils的 BeanUtils工具类可能具有此功能。果然发现有个describe可以实现。试了下可以转换,但发现个问题,日期类型不能很好地转换,只能转换成Thu Sep 17 19:26:59 CST 2015这种格式,而我需要yyyy-MM-dd这种格式。翻了下源码发现有个日期转换器DateConverter,试了下注册到BeanUtilsBean中。
BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance();
DateConverter converter = new DateConverter();
converter.setPattern("yyyy-MM-dd");
beanUtilsBean.getConvertUtils().register(new ConverterFacade(converter), java.util.Date.class);
但发现不起作用,继续阅读源码发现,它只用了StringConverter 一种转换器,代码如下。
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 (converter.convert(String.class, value));
}
} else {
Converter converter = lookup(String.class);
return (converter.convert(String.class, value));
}
}
没办法只好重新覆盖这段代码,最终代码如下:
public class ExtConvertUtilsBean extends ConvertUtilsBean{
@Override
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 (converter.convert(String.class, value));
}
} else {
Converter converter = null;
if(value instanceof java.util.Date ){
converter = lookup(java.util.Date.class);
}else{
converter = lookup(String.class);
}
return (converter.convert(String.class, value));
}
}
}
DateConverter converter = new DateConverter();
converter.setPattern(pattern);
beanUtilsBean.getConvertUtils().register(new ConverterFacade(converter), java.util.Date.class);
beanUtilsBean.describe(object);
至此可以实现日期自定义格式功能。