spring BeanUtils.copyProperties只拷貝不為null的屬性

spring BeanUtils.copyProperties只拷貝不為null的屬性

在MVC的開發(fā)模式中經(jīng)常需要將model與pojo的數(shù)據(jù)綁定本辐,apache和spring的工具包中都有BeanUtils践险,使用其中的copyProperties方法可以非常方便的進(jìn)行這些工作,但在實(shí)際應(yīng)用中發(fā)現(xiàn),對(duì)于null的處理不太符合個(gè)人的需要熏迹,例如在進(jìn)行修改操作中只需要對(duì)model中某一項(xiàng)進(jìn)行修改蚓挤,那么一般我們?cè)陧?yè)面上只提交model的ID及需要修改項(xiàng)的值思犁,這個(gè)時(shí)候使用BeanUtils.copyProperties會(huì)將其他的null綁定到pojo中去萨驶。

BeanUtils.copyProperties的使用要導(dǎo)入:

org.springframework.beans.BeanUtils;
直接上代碼:

package com.test;

import com.hourumiyue.system.SpringUtil;
import org.springframework.beans.BeanUtils;

public class TestBeanUtiles {

    public static void main(String[] args) {

        NewPerson newPerson = new NewPerson();
        newPerson.setName("miyue");//前臺(tái)用戶更新過(guò)的數(shù)據(jù)歉摧,例如前臺(tái)只修改了用戶名

        //下面我們假設(shè)是從數(shù)據(jù)庫(kù)加載出來(lái)的老數(shù)據(jù)
        OldPerson oldPerson = new OldPerson();
        oldPerson.setSex("nv");
        oldPerson.setAge(5);
        //如果我們想把新數(shù)據(jù)更新到老數(shù)據(jù)這個(gè)對(duì)象里面艇肴,我們就可以借助BeanUtils.copyProperties()的方法如下:
        BeanUtils.copyProperties(newPerson, oldPerson);

     System.out.println(newPerson.toString());
        System.out.println(oldPerson.toString());
    }
}

上面的代碼打印結(jié)果如下:

NewPerson{name='miyue', sex='null', age=0}

OldPerson{name='miyue', sex='null', age=0}

從上面我們可以看出腔呜,新的對(duì)象確實(shí)把修改的數(shù)據(jù)更新給老對(duì)象了,但是它卻把原來(lái)為null或者int類型默認(rèn)為0的值也都賦給了老對(duì)象再悼,這肯定不合理的核畴,下面我們自己寫了一個(gè)加工類,大家可以直接調(diào)用我們加工類的copyPropertiesIgnoreNull()方法即可忽略null值冲九,避免老數(shù)據(jù)被null覆蓋的尷尬

/**
 * 版權(quán)所有 (c) 2018谤草,中金支付有限公司  
 */
package com.yanshemiyue.system;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import java.util.HashSet;
import java.util.Set;

/**
* 類說(shuō)明
* 
* <pre>
* Modify Information:
* Author        Date          Description
* ============ =========== ============================
* houru      2018年1月4日    Create this file
* </pre>
* 
*/

public class SpringUtil implements ApplicationContextAware {

    /** 
     * 當(dāng)前IOC 
     *  
     */  
    private static ApplicationContext applicationContext;  

    /** 
     * * 設(shè)置當(dāng)前上下文環(huán)境跟束,此方法由spring自動(dòng)裝配 
     *  
     */  
    @Override  
    public void setApplicationContext(ApplicationContext arg0)  
            throws BeansException {  
        applicationContext = arg0;  
    }  

    /** 
     * 從當(dāng)前IOC獲取bean 
     * 
     * @param id 
     * bean的id 
     * @return 
     *
     */  
    public static Object getObject(String id) {  
        Object object = null;  
        object = applicationContext.getBean(id);  
        return object;  
    } 
    
    public static String[] getNullPropertyNames (Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();

        Set<String> emptyNames = new HashSet<String>();
        for(java.beans.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);
    }

    public static void copyPropertiesIgnoreNull(Object src, Object target){
        BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
    }

}

調(diào)用:copyPropertiesIgnoreNull

package com.test;
import com.yxjr.system.SpringUtil;
public class TestBeanUtiles {
    public static void main(String[] args) {
        NewPerson newPerson = new NewPerson();
        newPerson.setName("miyue");//前臺(tái)用戶更新過(guò)的數(shù)據(jù),例如前臺(tái)只修改了用戶名
        //下面我們假設(shè)是從數(shù)據(jù)庫(kù)加載出來(lái)的老數(shù)據(jù)
        OldPerson oldPerson = new OldPerson();
        oldPerson.setSex("nv");
        oldPerson.setAge(5);
        //如果我們想把新數(shù)據(jù)更新到老數(shù)據(jù)這個(gè)對(duì)象里面丑孩,我們就可以借助BeanUtils.copyProperties()的方法如下:
        //BeanUtils.copyProperties(newPerson, oldPerson);
        SpringUtil.copyPropertiesIgnoreNull(newPerson, oldPerson);
        System.out.println(newPerson.toString());
        System.out.println(oldPerson.toString());
    }
}

打印結(jié)果:

NewPerson{name='miyue', sex='null', age=0}
OldPerson{name='miyue', sex='nv', age=0}

現(xiàn)在就可以看出老數(shù)據(jù)沒有被null覆蓋

原文鏈接:https://www.cnblogs.com/luzhanshi/p/11129982.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冀宴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子温学,更是在濱河造成了極大的恐慌略贮,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仗岖,死亡現(xiàn)場(chǎng)離奇詭異逃延,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)轧拄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門揽祥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人檩电,你說(shuō)我怎么就攤上這事拄丰。” “怎么了俐末?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵愈案,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鹅搪,道長(zhǎng)站绪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任丽柿,我火速辦了婚禮恢准,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甫题。我一直安慰自己馁筐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布坠非。 她就那樣靜靜地躺著敏沉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炎码。 梳的紋絲不亂的頭發(fā)上盟迟,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音潦闲,去河邊找鬼攒菠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛歉闰,可吹牛的內(nèi)容都是我干的辖众。 我是一名探鬼主播卓起,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凹炸!你這毒婦竟也來(lái)了戏阅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤啤它,失蹤者是張志新(化名)和其女友劉穎饲握,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚕键,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡救欧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锣光。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笆怠。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖誊爹,靈堂內(nèi)的尸體忽然破棺而出蹬刷,到底是詐尸還是另有隱情,我是刑警寧澤频丘,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布办成,位于F島的核電站,受9級(jí)特大地震影響搂漠,放射性物質(zhì)發(fā)生泄漏迂卢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一桐汤、第九天 我趴在偏房一處隱蔽的房頂上張望而克。 院中可真熱鬧,春花似錦怔毛、人聲如沸员萍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碎绎。三九已至,卻和暖如春抗果,著一層夾襖步出監(jiān)牢的瞬間筋帖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工窖张, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幕随,地道東北人蚁滋。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓宿接,卻偏偏與公主長(zhǎng)得像赘淮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子睦霎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容