BeanUtils.copyProperties在拷貝屬性時(shí)忽略空值的操作
BeanUtils.copyProperties忽略空值
使用spring開(kāi)發(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ù)是可變長(zhǎng)類(lèi)型,動(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
依賴(lài)包:
<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ù)制類(lèi)時(shí)需要注意 值為空的情況
BeanUtils.copyProperties(dest, orig);
此處引用的是 org.apache.commons.beanutils.BeanUtils;
ConvertUtils.register(new DateConverter(null), java.util.Date.class);
添加這一行代碼,解決date 類(lèi)型為空 報(bào)錯(cuò)
ConvertUtils.register(new IntegerConverter(null), Integer.class);
這一行,可以解決 integer值為空時(shí)不自動(dòng)賦值為0;
另外 double 可能也很特殊,我沒(méi)研究。
注意這些后加的條件要放在BeanUtils.copyProperties 之前。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)并訪問(wèn)功能
zookeeper和eureka一樣,是用于充當(dāng)服務(wù)注冊(cè)功能服務(wù)器的一個(gè)springcloud插件,這篇文章主要介紹了SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)并訪問(wèn),需要的朋友可以參考下2022-06-06
java線程池ThreadPoolExecutor的八種拒絕策略示例詳解
ThreadPoolExecutor是一個(gè)典型的緩存池化設(shè)計(jì)的產(chǎn)物,因?yàn)槌刈佑写笮?當(dāng)池子體積不夠承載時(shí),就涉及到拒絕策略。JDK中已預(yù)設(shè)了?4?種線程池拒絕策略,下面結(jié)合場(chǎng)景詳細(xì)聊聊這些策略的使用場(chǎng)景以及還能擴(kuò)展哪些拒絕策略2021-11-11
Java 定時(shí)器(Timer,TimerTask)詳解及實(shí)例代碼
這篇文章主要介紹了 Java 定時(shí)器(Timer,TimerTask)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
帶你一文深入認(rèn)識(shí)Java?String類(lèi)
這篇文章主要介紹了帶你一文深入認(rèn)識(shí)Java?String類(lèi),String 類(lèi)在Java中是很常用的類(lèi),很重要的類(lèi),在后續(xù)的學(xué)習(xí)中經(jīng)常會(huì)用到,是后續(xù)學(xué)習(xí)的基礎(chǔ), 文章圍繞主題展開(kāi)更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-06-06
Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼
這篇文章主要介紹了 Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼,需要的朋友可以參考下2017-03-03
解決mybatisPlus 中的field-strategy配置失效問(wèn)題
這篇文章主要介紹了解決mybatisPlus 中的field-strategy配置失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Java去掉小數(shù)點(diǎn)后面無(wú)效0的方案與建議
當(dāng)前小數(shù)點(diǎn)后面的位數(shù)過(guò)多的時(shí)候,多余的0沒(méi)有實(shí)際意義,下面這篇文章主要給大家介紹了關(guān)于Java去掉小數(shù)點(diǎn)后面無(wú)效0的方案與建議,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
通過(guò)Spring Boot配置動(dòng)態(tài)數(shù)據(jù)源訪問(wèn)多個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了通過(guò)Spring Boot配置動(dòng)態(tài)數(shù)據(jù)源訪問(wèn)多個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-03-03

