BeanUtils.copyProperties擴充套件--String轉Date
阿新 • • 發佈:2019-01-26
BeanUtils.copyProperties(target,source)和PropertyUtils.copyProperties(target,source)都能將源物件的屬性的值拷貝到目標物件相同屬性名中。
區別在於:
BeanUtils.copyProperties(target,source)支援基礎型別、String、java.sql.Date、java.sql.Timestamp、java.sql.Time之間的型別轉換,即只要這些型別的屬性名相同那麼拷貝就能成功。但是會預設初始化屬性值。注意:不支援java.util.Date型別的轉化,需手動設定。
PropertyUtils.copyProperties(target,source)不支援型別轉換,但是不會初始話屬性值,允許屬性值為null。
在webservice中遇到了一個String型別,但是資料庫是java.util.Date型別,因為物件屬性不較多,所以在使用PropertyUtils.copyProperties(target,source)時報錯。
後來查了下資料,說BeanUtils能進行型別轉換,故而就自定義了一個String轉Date的工具類。
//定義工具類
//定義日期轉換格式package com.dhcc.phms.common.beanutils; import java.lang.reflect.InvocationTargetException; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtils; public class BeanUtilsEx extends BeanUtils{ static { //註冊util.date的轉換器,即允許BeanUtils.copyProperties時的源目標的util型別的值允許為空 ConvertUtils.register(new DateConvert(), java.util.Date.class); ConvertUtils.register(new DateConvert(), String.class); // BeanUtilsBean beanUtils = new BeanUtilsBean(ConvertUtils.class,new PropertyUtilsBean()); } public static void copyProperties(Object target, Object source) throws InvocationTargetException, IllegalAccessException { //支援對日期copy org.apache.commons.beanutils.BeanUtils.copyProperties(target, source); } }
package com.dhcc.phms.common.beanutils; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.beanutils.Converter; public class DateConvert implements Converter{ @Override public Object convert(Class class1, Object value) { if(value == null){ return null; } if(value instanceof Date){ return value; } if (value instanceof Long) { Long longValue = (Long) value; return new Date(longValue.longValue()); } if (value instanceof String) { String dateStr = (String)value; Date endTime = null; try { String regexp1 = "([0-9]{4})-([0-1][0-9])-([0-3][0-9])T([0-2][0-9]):([0-6][0-9]):([0-6][0-9])"; String regexp2 = "([0-9]{4})-([0-1][0-9])-([0-3][0-9]) ([0-2][0-9]):([0-6][0-9]):([0-6][0-9])"; String regexp3 = "([0-9]{4})-([0-1][0-9])-([0-3][0-9])"; if(dateStr.matches(regexp1)){ dateStr = dateStr.split("T")[0]+" "+dateStr.split("T")[1]; DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); endTime = sdf.parse(dateStr); return endTime; }else if(dateStr.matches(regexp2)){ DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); endTime = sdf.parse(dateStr); return endTime; }else if(dateStr.matches(regexp3)){ DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); endTime = sdf.parse(dateStr); return endTime; }else{ return dateStr; } } catch (ParseException e) { e.printStackTrace(); } } return value; } }
使用時用BeanUtilsEx.copyProperties(target,source)時即可實現String轉換為Date。
除此之外,如果需要轉換的屬性比較少時,可先將source物件中衝突屬性取出來,另存一份,然後將該屬性值置為null,因為不會拷貝null屬性,所以拷貝的時候不會出錯。當拷貝完成後再將衝突屬性轉換為所需格式,set進目標物件。這樣也是實現效果。
測試程式碼如下:
目標物件TargetObject
package test;
import java.util.Date;
public class TargetObject {
Date date;
Boolean isOther;
public TargetObject(Date date,Boolean isOther) {
super();
this.date = date;
this.isOther = isOther;
}
public TargetObject() {
super();
// TODO Auto-generated constructor stub
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Boolean getIsOther() {
return isOther;
}
public void setIsOther(Boolean isOther) {
this.isOther = isOther;
}
@Override
public String toString() {
return "TargetObject [date=" + date + ", isOther=" + isOther + "]";
}
}
源物件SourceObject
package test; public class SourceObject { String date; String other; public SourceObject(String date,String other) { super(); this.date = date; this.other = other; } public SourceObject() { super(); // TODO Auto-generated constructor stub } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getOther() { return other; } public void setOther(String other) { this.other = other; } @Override public String toString() { return "SourceObject [date=" + date + ", other=" + other + "]"; } }
測試程式碼
public static void main(String[] args) {
SourceObject source = new SourceObject("2017-07-17","false");
TargetObject target = new TargetObject();
try {
BeanUtilsEx.copyProperties(target,source);
System.out.println(source.toString());//SourceObject [date=2017-07-17, other=false]
System.out.println(target.toString());//TargetObject [date=Mon Jul 17 00:00:00 CST 2017, isOther=null]
if(source.getOther().equals("true")) {//對於屬性名不一樣的屬性是不會賦值的,需要手動設定
target.setIsOther(true);
}else {
target.setIsOther(false);
}
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}