最近在项目中使用BeanUtils.copyProperties拷贝不同实体类的时候,出现了一个关于时间上的问题,具体的情况是source中的时间格式是yyyy-MM-dd HH:mm:ss,其数据也是正常精确到时分秒的,但是拷贝之后的时间,其时分秒的数据却丢失了,变成了yyyy-MM-dd 00:00:00,这种形式。
最开始以为是BeanUtils对时间类型的处理有问题,后来自己单独写了一下,发现并不是BeanUtils处理的问题,于是开始翻源码,发现BeanUtils是通过获取所有的get和set方法来对字段属性进行copy的,也就是说,无论实体类中是否有这个字段属性,只要包含get和set方法就一定会被copy。也就是BeanUtils要求的必须要有get和set方法。
public static class Source{
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
public static class Target{
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
public static void main(String[] args) {
Source source = new Source();
source.setDate(new Date());
Target target = new Target();
BeanUtils.copyProperties(source,target);
System.out.println(source.getDate());
System.out.println(target.getDate());
}
于是检查了项目中的get和set方法,发现了其中确实包含了一个单独的get和set方法,正是针对时间字段进行处理的,其set方法正是格式化时间为yyyy-MM-dd,于是,在调用BeanUtils时,调用了另一个重载的方法,将那个单独的get和set方法对应的字段作为需要忽略的字段处理,跳过调用其get和set方法,果然,结果正常了。
BeanUtils.copyProperties(source,target,"gainDateString");
第三个参数即为要忽略的字段,可以传多个。