电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

java Beanutils.copyProperties( )用法詳解

瀏覽:4日期:2022-09-01 16:48:57

這是一篇開發自辯甩鍋稿~~~~

昨天測試小姐姐將我的一個bug單重開了,emmmm....內心OS:就調整下對象某個屬性類型這么簡單的操作,我怎么可能會出錯呢,一定不是我的鍋!!but再怎么抗拒,bug還是要改的,畢竟晚上就要發版本了~~

老老實實將我前天改的部分跟了一遍,恩,完美,沒有任何的缺失~~but本應success的測試數據,接口返還的結果確實是false來著,那還是老老實實debug吧。

一步步跟下來,恩,多么順暢,就說一定不是我的鍋~~誒?不對不對,這里的ID值,為啥是null?傳過來有值的呀!!發現原來是別人在修復bug時用了Beanutils.copyProperties( obj1,obj2),but 因為obj1中屬性名稱id,obj2中屬性名稱afterId,因為Beanutils.copyProperties( )要求處理的兩個對象的屬性名稱相同時才可以正常賦值,那好吧,我們今天就好好講講關于Beanutils.copyProperties( )吧~

1、簡介

BeanUtils提供對Java反射和自省API的包裝。其主要目的是利用反射機制對JavaBean的屬性進行處理。

2、用法

如果有兩個具有很多相同屬性的JavaBean,一個很常見的情況就是Struts里的PO對象(持久對象)和對應的ActionForm。例如:一個用戶注冊頁面,有一個User實體類和一個UserActionForm實體類,我們一般會在Action里從ActionForm構造一個PO對象,傳統的方式是使用類似下面的語句對屬性逐個賦值:

// 獲取 ActionForm 表單數據 UserActionForm uForm = (UserActionForm) form; // 構造一個User對象 User user = new User(); // 逐一賦值 user.setUsername(uForm.getUsername); user.setPassword(uForm.getPassword); user.setAge(uForm.getAge); ........... ........... // 然后調用JDBC、或操作Hibernate 持久化對象User到數據庫 ...

通過這樣的方法如果表單屬性字段很多,達到了100、1000甚至更多,那我們不是要寫100、1000行set、get了。誰都不愿意這樣做。

而我們使用 BeanUtils.copyProperties() 方法以后,代碼量大大的減少,而且整體程序看著也簡潔明朗,代碼如下:

// 獲取 ActionForm 表單數據 UserActionForm uForm = (UserActionForm) form; // 構造一個User對象 User user = new User(); // 賦值 BeanUtils.copyProperties(user, uForm); // 然后調用JDBC、或操作Hibernate 持久化對象User到數據庫 .......

注:如果User和UserActionForm 間存在名稱不相同的屬性,則BeanUtils不對這些屬性進行處理,需要手動處理。例如:User類里面有個createDate 創建時間字段,而UserActionForm里面無此字段。BeanUtils.copyProperties()不會對此字段做任何處理。必須要自己手動處理。用法總結如下:

[java] view plain copy print?BeanUtils.copyProperties('要轉換的類', '轉換后的類'); [java] view plain copy print?PropertyUtils.copyProperties('要轉換的類', '轉換后的類');

用法其實很簡單,第一個參數是要轉換的類,第二個參數是轉換后的類。

BeanUtils.copyProperties VS PropertyUtils.copyProperties

兩者最大的區別是:

BeanUtils.copyProperties會進行類型轉換,而PropertyUtils.copyProperties不會。既然進行了類型轉換,那BeanUtils.copyProperties的速度比不上PropertyUtils.copyProperties。

因此,PropertyUtils.copyProperties應用的范圍稍為窄一點,它只對名字和類型都一樣的屬性進行copy,如果名字一樣但類型不一樣,它會報錯。

使用BeanUtils有幾個要注意的地方:

1.對于類型為Boolean/Short/Integer/Float/Double的屬性,它會轉換為0:

public class User { private Integer intVal; private Double doubleVal; private Short shortVal; private Long longVal; private Float floatVal; private Byte byteVal; private Boolean booleanVal; } User src = new User(); User dest = new User(); BeanUtils.copyProperties(dest, src); System.out.println(src); System.out.println(dest); //輸出 User [intVal=null, doubleVal=null, shortVal=null, longVal=null, floatVal=null, byteVal=null, booleanVal=null] User [intVal=0, doubleVal=0.0, shortVal=0, longVal=0, floatVal=0.0, byteVal=0, booleanVal=false]

在stackoverflow上有人解釋說是因為這幾個類型都有對應的基本類型,在進行類型轉換時,有可能遇到類似Integer -> int的轉換,此時顯然不能對int類型的屬性賦值為null,因此統一轉換為0。

如何讓它不要轉為0呢?可以這樣:

import org.apache.commons.beanutils.converters.IntegerConverter; IntegerConverter converter = new IntegerConverter(null); //默認為null,而不是0 BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); beanUtilsBean.getConvertUtils().register(converter, Integer.class);

2.對于java.util.Date/BigDecimal/java.sql.Date/java.sql.Timestamp/java.sql.Time這幾個類,如果值為null,則在copy時會拋異常,需要使用對應的Conveter:

public class User2 { private java.util.Date javaUtilDateVal; private java.sql.Date javaSqlDateVal; private java.sql.Timestamp javaSqlTimeStampVal; private BigDecimal bigDecimalVal; private java.sql.Time javaSqlTime; } User2 src = new User2(); User2 dest = new User2(); BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); //如果沒有下面幾行,則在轉換null時會拋異常,例如:org.apache.commons.beanutils.ConversionException: No value specified for ’BigDecimal’ //在org.apache.commons.beanutils.converters這個包下面有很多的Converter,可以按需要使用 beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.BigDecimalConverter(null), BigDecimal.class); beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.DateConverter(null), java.util.Date.class); beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlTimestampConverter(null), java.sql.Timestamp.class); beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.sql.Date.class); beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlTimeConverter(null), java.sql.Time.class); beanUtilsBean.copyProperties(dest, src); System.out.println(src); System.out.println(dest);

使用BeanUtils還會經常碰到這樣變態的需求:

假設是從A復制到B:需求1:如果B中某字段有值(不為null),則該字段不復制;也就是B中該字段沒值時,才進行復制,適合于對B進行補充值的情況。需求2:如果A中某字段沒值(為null),則該字段不復制,也就是不要把null復制到B當中。

對于需求1,可以這樣:

import org.apache.commons.beanutils.BeanUtilsBean; import org.apache.commons.beanutils.PropertyUtils; public class CopyWhenNullBeanUtilsBean extends BeanUtilsBean{ @Override public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException { try { Object destValue = PropertyUtils.getSimpleProperty(bean, name); if (destValue == null) { super.copyProperty(bean, name, value); } } catch (NoSuchMethodException e) { throw new RuntimeException(e); } } }

對于需求2,可以這樣:

import org.apache.commons.beanutils.BeanUtilsBean; public class CopyFromNotNullBeanUtilsBean extends BeanUtilsBean { @Override public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException { if (value == null) { return; } super.copyProperty(bean, name, value); } }

到此這篇關于java Beanutils.copyProperties( )用法詳解的文章就介紹到這了,更多相關java Beanutils.copyProperties 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 便携式表面粗糙度仪-彩屏硬度计-分体式粗糙度仪-北京凯达科仪科技有限公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 传爱自考网_传爱自学考试网| 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | Pos机办理_个人商户免费POS机申请-拉卡拉办理网 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 高低温老化试验机-步入式/低温恒温恒湿试验机-百科 | 首页-恒温恒湿试验箱_恒温恒湿箱_高低温试验箱_高低温交变湿热试验箱_苏州正合 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 闪电优家-卫生间防水补漏_酒店漏水渗水维修_防水堵漏公司 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 谈股票-今日股票行情走势分析-牛股推荐排行榜 | 不锈钢散热器,冷却翅片管散热器厂家-无锡市烨晟化工装备科技有限公司 | 沉降天平_沉降粒度仪_液体比重仪-上海方瑞仪器有限公司 | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 净水器代理,净水器招商,净水器加盟-FineSky德国法兹全屋净水 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 喷涂流水线,涂装流水线,喷漆流水线-山东天意设备科技有限公司 | 注浆压力变送器-高温熔体传感器-矿用压力传感器|ZHYQ朝辉 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 浙江红酒库-冰雕库-气调库-茶叶库安装-医药疫苗冷库-食品物流恒温恒湿车间-杭州领顺实业有限公司 | 不锈钢水箱厂家,不锈钢保温水箱-山东桑特供水设备 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 德州网站开发定制-小程序开发制作-APP软件开发-「两山开发」 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | TTCMS自助建站_网站建设_自助建站_免费网站_免费建站_天天向上旗下品牌 | 汝成内控-行政事业单位内部控制管理服务商 | 砖机托板价格|免烧砖托板|空心砖托板厂家_山东宏升砖机托板厂 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 医学模型生产厂家-显微手术模拟训练器-仿真手术模拟训练系统-北京医教科技 | 美甲贴片-指甲贴片-穿戴美甲-假指甲厂家--薇丝黛拉 | 粉末冶金-粉末冶金齿轮-粉末冶金零件厂家-东莞市正朗精密金属零件有限公司 |