BeanUtills日期转换问题

时间:2013-05-15 09:22:50

标签: java type-conversion

我尝试使用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()));
    }
}

2 个答案:

答案 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类具有getset方法,可以在此方案中轻松应用。

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);
        }
    }
}