先说解决方法,再说原理。
自定义转化器
1.编写一个类 实现Conventer接口
2.实现方法
convert(转换成的类型,前台页面传入的字符串)
3.注册转化器 在封装数据之前注册
ConvertUtils.register(new MyConventer(), Date.class);
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.beanutils.Converter;
public class MyConventer implements Converter {
@Override
public Object convert(Class clazz, Object value) {
// class 要装成的类型
// object 页面上传入的值
//将object 转成 date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse((String)value);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
注册自定义转换器
ConvertUtils.register(new MyConventer(), Date.class);//注册自定义转化器
BeanUtils.populate(user, request.getParameterMap());
以下是推想,没有看过源码...
转换器属于org.apache.commons.beanutils.ConvertUtils,
所以可以知道注册自定义转换器用到的ConvertUtils.register(new MyConventer(), Date.class)是beanutils自带的,
支持传入一个自定义的转换器,帮助beanutils的populate方法自动转换。
从上面搜到的资料来看,convert方法就是转换的核心方法。所以自定义converter的时候,要通过这个方法来实现转换逻辑,上面第一段代码的override证明了这点,convert是converter的方法。
而注册自定义转换器ConvertUtils.register(new MyConventer(), Date.class)则是为了告诉populate方法,遇到Date类型的就使用MyConventer来转换。
还有一点,第一段代码里没有使用到传入进来的Class参数,这个应该是为了使用反射技术去完成一些私有方法(不确定)等?
所以整理一下思路,就是自定义一个converter,先实现converter接口,重写convert方法,在beanutils封装数据之前注册转换器。
网友评论