BeanUtils.copyProperties在拷貝屬性時(shí)忽略空值的操作
BeanUtils.copyProperties忽略空值
使用spring開發(fā)的人,對(duì)這行代碼肯定不陌生,常用于DTO、VO、PO之間的復(fù)制。
/** * 全屬性copy對(duì)象 * **/ BeanUtils.copyProperties(Object source, Object target)
但這行代碼會(huì)將所有的屬性都進(jìn)行copy,有的時(shí)候我們想要個(gè)別屬性不進(jìn)行復(fù)制(比如:null值屬性),這時(shí)就需要用到另一個(gè)方法:
/** * 忽略某些屬性copy對(duì)象 * **/ BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)
第三個(gè)參數(shù)是可變長類型,動(dòng)態(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); }
拓展一下下:
很多時(shí)候我們需要將Map與Bean之間轉(zhuǎn)換,提供兩種方式:
一、使用fastjson
1、map轉(zhuǎn)bean:
Map paramMap = new HashMap(); String jsonStr = JSONObject.toJSONString(paramMap); Object infoDo = JSON.parseObject(jsonStr, Object.class);
2、bean轉(zhuǎn)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>
然后調(diào)用方法:
/** * Bean轉(zhuǎn)map * * @param bean * @return */ public Map describe(Object bean); /** * map轉(zhuǎn)bean * * @param bean * @param map */ public void populate (Object bean, Map map);
同時(shí)可以按指定的屬性列表copy對(duì)象:
/** * 按指定的屬性列表賦值對(duì)象 * * @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 在復(fù)制類時(shí)需要注意 值為空的情況
BeanUtils.copyProperties(dest, orig);
此處引用的是 org.apache.commons.beanutils.BeanUtils;
ConvertUtils.register(new DateConverter(null), java.util.Date.class);
添加這一行代碼,解決date 類型為空 報(bào)錯(cuò)
ConvertUtils.register(new IntegerConverter(null), Integer.class);
這一行,可以解決 integer值為空時(shí)不自動(dòng)賦值為0;
另外 double 可能也很特殊,我沒研究。
注意這些后加的條件要放在BeanUtils.copyProperties 之前。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot詳解整合Spring?Boot?Admin實(shí)現(xiàn)監(jiān)控功能
這篇文章主要介紹了SpringBoot整合Spring?Boot?Admin實(shí)現(xiàn)服務(wù)監(jiān)控,內(nèi)容包括Server端服務(wù)開發(fā),Client端服務(wù)開發(fā)其中Spring?Boot?Admin還可以對(duì)其監(jiān)控的服務(wù)提供告警功能,如服務(wù)宕機(jī)時(shí),可以及時(shí)以郵件方式通知運(yùn)維人員,感興趣的朋友跟隨小編一起看看吧2022-07-07java 單元測試 對(duì)h2數(shù)據(jù)庫數(shù)據(jù)清理方式
這篇文章主要介紹了java 單元測試 對(duì)h2數(shù)據(jù)庫數(shù)據(jù)清理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09JDK8中的HashMap初始化和擴(kuò)容機(jī)制詳解
這篇文章主要介紹了JDK8中的HashMap初始化和擴(kuò)容機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(2)
這篇文章主要介紹了使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(2)的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11Spring MVC學(xué)習(xí)教程之RequestMappingHandlerAdapter詳解
這篇文章主要給大家介紹了關(guān)于Spring MVC學(xué)習(xí)教程之RequestMappingHandlerAdapter的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11springboot項(xiàng)目中controller層與前端的參數(shù)傳遞方式
這篇文章主要介紹了springboot項(xiàng)目中controller層與前端的參數(shù)傳遞方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10SpringBoot與velocity的結(jié)合的示例代碼
本篇文章主要介紹了SpringBoot與velocity的結(jié)合的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03