BeanUtils.copyProperties在拷貝屬性時忽略空值的操作
BeanUtils.copyProperties忽略空值
使用spring開發(fā)的人,對這行代碼肯定不陌生,常用于DTO、VO、PO之間的復制。
/** * 全屬性copy對象 * **/ BeanUtils.copyProperties(Object source, Object target)
但這行代碼會將所有的屬性都進行copy,有的時候我們想要個別屬性不進行復制(比如:null值屬性),這時就需要用到另一個方法:
/** * 忽略某些屬性copy對象 * **/ BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)
第三個參數(shù)是可變長類型,動態(tài)獲取忽略的屬性:
/**
* 獲取需要忽略的屬性
*
* @param source
* @return
*/
public static String[] getNullPropertyNames (Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for(PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
// 此處判斷可根據(jù)需求修改
if (srcValue == null) {
emptyNames.add(pd.getName());
}
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
拓展一下下:
很多時候我們需要將Map與Bean之間轉換,提供兩種方式:
一、使用fastjson
1、map轉bean:
Map paramMap = new HashMap(); String jsonStr = JSONObject.toJSONString(paramMap); Object infoDo = JSON.parseObject(jsonStr, Object.class);
2、bean轉map:
Map<String, Object> map = JSON.parseObject(JSON.toJSONString(object),new TypeReference<Map<String,Object>>(){});
二、使用commons-beanutils
依賴包:
<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> </dependency>
然后調用方法:
/** * Bean轉map * * @param bean * @return */ public Map describe(Object bean); /** * map轉bean * * @param bean * @param map */ public void populate (Object bean, Map map);
同時可以按指定的屬性列表copy對象:
/**
* 按指定的屬性列表賦值對象
*
* @param source
* @param target
* @param properties
*
*/
public static void copyWithProperties(Object source, Object target, List<String> properties) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
for (String property : properties) {
PropertyUtils.setProperty(target, property, PropertyUtils.getProperty(source, property));
}
}
BeanUtils 在復制類時需要注意 值為空的情況
BeanUtils.copyProperties(dest, orig);
此處引用的是 org.apache.commons.beanutils.BeanUtils;
ConvertUtils.register(new DateConverter(null), java.util.Date.class);
添加這一行代碼,解決date 類型為空 報錯
ConvertUtils.register(new IntegerConverter(null), Integer.class);
這一行,可以解決 integer值為空時不自動賦值為0;
另外 double 可能也很特殊,我沒研究。
注意這些后加的條件要放在BeanUtils.copyProperties 之前。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringCloud集成zookeeper實現(xiàn)服務注冊并訪問功能
zookeeper和eureka一樣,是用于充當服務注冊功能服務器的一個springcloud插件,這篇文章主要介紹了SpringCloud集成zookeeper實現(xiàn)服務注冊并訪問,需要的朋友可以參考下2022-06-06
java線程池ThreadPoolExecutor的八種拒絕策略示例詳解
ThreadPoolExecutor是一個典型的緩存池化設計的產物,因為池子有大小,當池子體積不夠承載時,就涉及到拒絕策略。JDK中已預設了?4?種線程池拒絕策略,下面結合場景詳細聊聊這些策略的使用場景以及還能擴展哪些拒絕策略2021-11-11
Java 定時器(Timer,TimerTask)詳解及實例代碼
這篇文章主要介紹了 Java 定時器(Timer,TimerTask)詳解及實例代碼的相關資料,需要的朋友可以參考下2017-01-01
Mybatis 中的一對一,一對多,多對多的配置原則示例代碼
這篇文章主要介紹了 Mybatis 中的一對一,一對多,多對多的配置原則示例代碼,需要的朋友可以參考下2017-03-03
解決mybatisPlus 中的field-strategy配置失效問題
這篇文章主要介紹了解決mybatisPlus 中的field-strategy配置失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
通過Spring Boot配置動態(tài)數(shù)據(jù)源訪問多個數(shù)據(jù)庫的實現(xiàn)代碼
這篇文章主要介紹了通過Spring Boot配置動態(tài)數(shù)據(jù)源訪問多個數(shù)據(jù)庫的實現(xiàn)代碼,需要的朋友可以參考下2018-03-03

