BeanUtils.copyProperties 選擇性賦值欄位

小碼code發表於2022-01-10

BeanUtils.copyProperties 在欄位賦值上有強大的功能,如果有兩個的類,如果需要將相同的欄位賦值,就可以直接賦制。而不需要每個欄位都需要一個一個賦制。

BeanUtils.copyProperties 用法全賦制

先建立一個實體類

public class User {

	private String name;
	
	private Integer age;
        // 省略get/set方法
}

在賦制資料

User use = new User();
use.setName("jeremy");
use.setAge(23);
User newUser = new User();
BeanUtils.copyProperties(use,newUser);
System.out.println("賦制後的資料,姓名:"+ newUser.getName() + " 年齡:" + newUser.getAge() );

控制檯輸出如下資料,說明資料賦製成功。

賦制後的資料,姓名:jeremy 年齡:23

選擇性賦制欄位

在工作中不要全部賦制資料,需要有選擇性賦制欄位。
比如有三個欄位 user1 , user2 , user3。

  • user1 的 name 有值
  • user2 的 age 有值
  • user3 都沒值

要將user1 的 name 值和user2 的 age 值賦值給user3。

BeanUtils.copyProperties 提供了忽略欄位介面,原始碼如下:

public static void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException {
        copyProperties(source, target, (Class)null, ignoreProperties);
    }

其中 ignoreProperties,將欄位排除在外。

以下是排除規則,如果欄位為空,欄位就不賦值。

	public static String[] getNullPropertyNames (Object source) {
		final BeanWrapper src = new BeanWrapperImpl(source);
		PropertyDescriptor[] pds = src.getPropertyDescriptors();
		Set<String> emptyNames = new HashSet<String>();
		for(PropertyDescriptor pd : pds) {
			Object srcValue = src.getPropertyValue(pd.getName());
			if (srcValue == null) {
				emptyNames.add(pd.getName());
			}
		}

		String[] result = new String[emptyNames.size()];
		return emptyNames.toArray(result);
	}

實現上面的 user1,user2 的欄位全都複製給 user3。

public static void main(String[] args) {
    User user1 = new User();
    user1.setName("jeremy");
    User user2 = new User();
    user2.setAge(23);
    User user3 = new User();
    BeanUtils.copyProperties(user1,user3);
    System.out.println("user1 賦值給 user3 資料,姓名:" + user3.getName() + " 年齡:" + user3.getAge());
    BeanUtils.copyProperties(user2,user3,getNullPropertyNames(user2));
    System.out.println("user2 賦值給 user3 資料,姓名:" + user3.getName() + " 年齡:" + user3.getAge());
}

控制檯輸出如下資料,說明賦值成功。

user1 賦值給 user3 資料,姓名:jeremy 年齡:null
user2 賦值給 user3 資料,姓名:jeremy 年齡:23

如果覺得文章對你有幫助的話,請點個推薦吧!

相關文章