1. 程式人生 > >BeanUtils.copyProperties擴充套件--String轉Date

BeanUtils.copyProperties擴充套件--String轉Date

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