BeanUtils.copyProperties
最近经常遇到有两个对象的大部分属性是相同的,之前是自己做的转换,今天发现有对象转换的工具类,事半功倍,常用的有如下三类:
一、org.apache.commons.beanutils.BeanUtils.copyProperties
public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException {
BeanUtilsBean.getInstance().copyProperties(dest, orig);
}
二、org.springframework.beans.BeanUtils.copyProperties:
public static void copyProperties(Object source, Object target) throws BeansException {
copyProperties(source, target, (Class)null, (String[])null);
}
三、org.apache.commons.beanutils.PropertyUtils.copyProperties
public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
PropertyUtilsBean.getInstance().copyProperties(dest, orig);
}
实例分割线
属性和类型的值都相同时,三者皆可以使用,但是遇到类型不一致时,转换就有问题了。
CsSettlementBill.java
private String remark;
private Date startDate;
转换成CsSettlementBillDto.java
private String remark;
private String startDate;
测试类
@Test
public void testApacheBeanUtilsCopyProperties() throws
InvocationTargetException, IllegalAccessException {
CsSettlementBill settlementBill = new CsSettlementBill();
settlementBill.setRemark("22133");
settlementBill.setStartDate(new Date());
CsSettlementBillDto dto = new CsSettlementBillDto();
org.apache.commons.beanutils.BeanUtils.copyProperties(dto, settlementBill); dto.setStartDate(com.suning.epp.pu.common.util.DateUtil.dateToString(settlementBill.getStartDate(), DATEFORMATE_YYYYMMDD));
System.out.println(dto);
}
运行结果正确
{"amount":"10000","startDate":"20170812"}
@Test
public void testSpringBeanUtilsCopyProperties() {
CsSettlementBill settlementBill = new CsSettlementBill();
settlementBill.setRemark("22133");
settlementBill.setStartDate(new Date());
CsSettlementBillDto dto = new CsSettlementBillDto();
org.springframework.beans.BeanUtils.copyProperties(settlementBill, dto);
System.out.println(dto);
}
运行异常,提示信息如下:
Could not copy properties from source to target; nested exception is java.lang.IllegalArgumentException: argument type mismatch
@Test
public void testApachePropertyUtilsCopyProperties() throws IllegalAccessException, NoSuchMethodException,InvocationTargetException {
CsSettlementBill settlementBill = new CsSettlementBill();
settlementBill.setRemark("22133");
settlementBill.setStartDate(new Date());
CsSettlementBillDto dto = new CsSettlementBillDto();
org.apache.commons.beanutils.PropertyUtils.copyProperties(dto, settlementBill);
System.out.println(dto);
}
运行异常,提示信息如下:
argument type mismatch - had objects of type "java.util.Date" but expected signature "java.lang.String"