我尝试使用BeanUtills将Data(java.util.Date)值从源复制到目标。它给出了一个Date to String转换异常。
这类问题的解决方案是什么?
我的实施如下..
import java.util.Date;
public class Bean1 {
private Date date;
public Bean1() {
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
=============================================== ============
import java.util.Date;
public class Bean2 {
private Date date;
public Bean2() {
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
=============================================== ============
我的复制属性方法如下
public static void copyProperties(Object src, Object dest) throws llegalAccessException,InvocationTargetException, NoSuchMethodException {
Field[] attributes = dest.getClass().getDeclaredFields();
for (Field property : attributes) {
BeanUtils.setProperty(dest, property.getName(), BeanUtils.getProperty(
src, property.getName()));
}
}
答案 0 :(得分:4)
最新版本的BeanUtils不支持Date属性的直接复制。您需要实现转换器(也是benutils包的一部分)并将该转换器与您的复制属性方法一起使用。这是为了避免任何错误导致两个对象中Date属性格式的任何差异。像下面这样的东西对你有用
public static void copyProperties(Object arg0, Object arg1)
throws IllegalAccessException, InvocationTargetException {
java.util.Date defaultValue = null;
Converter converter = new DateConverter(defaultValue);
BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance();
beanUtilsBean.getConvertUtils().register(converter, java.util.Date.class);
beanUtilsBean.copyProperties(arg0, arg1);
}
如果您确定两个对象中的日期格式保持不变,我建议您使用PropertyUtils。仅当src和目标上的Date属性的Date格式可能不同时,才需要使用转换器。
答案 1 :(得分:0)
可以使用反射简单地执行复制。 Field
类具有get
和set
方法,可以在此方案中轻松应用。
public static void main(String[] args) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException {
Bean1 bean1 = new Bean1();
bean1.setDate(new Date());
Bean2 bean2 = new Bean2();
System.out.println(bean2.getDate());
copyProperties(bean1, bean2);
System.out.println(bean2.getDate());
}
public static void copyProperties(Object src, Object dest) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Field[] attributes = dest.getClass().getDeclaredFields();
for (Field property : attributes) {
boolean isPrivate = false;
if(!property.isAccessible()){
property.setAccessible(true);
isPrivate = true;
}
Field srcField = src.getClass().getDeclaredField(property.getName());
property.set(dest, srcField.get(src));
if(isPrivate){
property.setAccessible(false);
}
}
}