BeanUtils 与 PropertyUtils 的区别

BeanUtils 与 PropertyUtils 的区别


以下都是网上down的
自己在使用过程中发现 两个的区别是
BeanUtils.copyProperties(orderMaterialDown,orderMaterialDown4Tax);
会报错:org.apache.commons.beanutils.ConversionException: No value specified
及存在bigDecimal为空的数据不允许转化。
需要将 BeanUtils 改为 PropertyUtils 就ok了。
其原理不多解释,看下面的

======================================

使用BeanUtils时,Date类型值为空的解决方法

org.apache.commons.beanutils.ConversionException: No value specified
现在系统里原先不出错的地方老是出现以上这个错误,不知道什么原因。也都是BeanUtils.copyProperties(teaInfo, infoForm);这种语句出的错。

集装箱运费

今天查了一上午,找到了它的用法,原来它是一种反射机制,使用copyProperties可以复制bean,不必重复写很多属性,只是效率不高。

1, BeanUtils.copyProperties(dest, orig); 这种copy是浅拷贝,复制后的2个Bean的同一个属性可能拥有同一个对象的ref,这个在使用时要小心,特别是对于属性为自定义类的情况.还要属性为集合类的情况。小心hibernate的Set
2,BeanUtils.copyProperties与PropertyUtils.copyProperties的区别
这两个类几乎有一摸一样的功能,唯一的区别是:BeanUtils在对Bean赋值是会进行类型转化。举例来说也就是在copyProperty时只要属性名相同,就算类型不同,BeanUtils也可以进行copy;而PropertyBean则可能会报错。当然2个Bean之间的同名属性的类型必须是可以转化的,否则用BeanUtils一样会报错。 若实现了org.apache.commons.beanutils.Converter接口则可以自定义类型之间的转化。

除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些
http://xiaozhao-521.javaeye.com/blog/244254
注意:有人说BeanUtils支持的转换类型不包括java.util.Date?
我用1.6.1版本试了BeanUtils.copyProperties,肯定是支持java.util.Date的。
3,LazyDynaBean可以实现动态的vo。
这样,有时候程序给view层的东西就可以用它来封装而不用专门建一个多余的vo类了。

参考:
http://jone0321.blogdriver.com/jone0321/615543.html
http://www.blogjava.net/kenzhh/archive/2008/09/03/226592.html
BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别
一、简介:
BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

二、用法:
BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:

public static void copyProperties(java.lang.Object dest,java.lang.Object orig)

throws java.lang.IllegalAccessException,
java.lang.reflect.InvocationTargetException

如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:

//得到TeacherForm

TeacherForm teacherForm=(TeacherForm)form;

//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());

teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());
//持久化Teacher对象到数据库
HibernateDAO.save(teacher);

而使用BeanUtils后,代码就大大改观了,如下所示:

//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO.save(teacher);

如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如 Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:

teacher.setModifyDate(new Date());

怎么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与 BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。BeanUtils支持的转换类型如下:

* java.lang.BigDecimal
* java.lang.BigInteger
* boolean and java.lang.Boolean
* byte and java.lang.Byte
* char and java.lang.Character
* java.lang.Class
* double and java.lang.Double
* float and java.lang.Float
* int and java.lang.Integer
* long and java.lang.Long
* short and java.lang.Short
* java.lang.String
* java.sql.Date
* java.sql.Time
* java.sql.Timestamp

这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。

三、优缺点:

Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我 将说明如何使用BeanUtils将local实体bean转换为对应的value 对象:

BeanUtils.copyProperties(aValue, aLocal)

上面的代码从aLocal对象复制属性到aValue对象。它相当简单!它不管local(或对应的value)对象有多少个属性,只管进行复制。我们假设 local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了!太强大了!太有用 了!

现在,还有一个坏消息:使用BeanUtils的成本惊人地昂贵!我做了一个简单的测试,BeanUtils所花费的时间要超过取数 据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力!

使用BeaUtils.copyProperties时,如果源目标中包含Date类型(sql.date,util,date)字段,而且该字段值为空时,会出现异常,无法赋值,解决方法如下:

1、建立一个新的BeaUtilsEx类继承BeanUtils

2、在其中声名Date类型的转换类

3、实现这个转换类

BeanUtilsEx代码如下:
package com.fish.util;

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.HashMap;
import java.util.Map;
import java.lang.reflect.*;

public final class BeanUtilEx
extends BeanUtils {

private static Map cache = new HashMap();
private static Log logger = LogFactory.getFactory().getInstance(BeanUtilEx.class);

private BeanUtilEx() {
}

static {
//注册sql.date的转换器,即允许BeanUtils.copyProperties时的源目标的sql类型的值允许为空
ConvertUtils.register(new SqlDateConverter(), java.util.Date.class);
//ConvertUtils.register(new SqlTimestampConverter(), java.sql.Timestamp.class);
//注册util.date的转换器,即允许BeanUtils.copyProperties时的源目标的util类型的值允许为空
ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
}

public static void copyProperties(Object target, Object source) throws
InvocationTargetException, IllegalAccessException {
//update bu zhuzf at 2004-9-29
//支持对日期copy

org.apache.commons.beanutils.BeanUtils.copyProperties(target, source);

}
}


项目中经常要用到BeanUtils, 可惜的是BeanUtils只支持基本数据类型转换, 最麻烦的是连比较常用的DATE类型都不支持, 无奈之下只好改装..

实际上只需要扩展Converter, 增加一个Converter接口的实例DateConvert, 在内部写好转换方法并注册就OK.. 上代码

import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.apache.commons.beanutils.Converter;

/**
*
* @author lucas
*/
public class DateConvert implements Converter {

public Object convert(Class arg0, Object arg1) {
String p = (String)arg1;
if(p== null || p.trim().length()==0){
return null;
}
try{[code="java"][/code]
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.parse(p.trim());
}
catch(Exception e){
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
return df.parse(p.trim());
} catch (ParseException ex) {
return null;
}
}

}

}
三种 绘制奈奎斯特曲线 的方法 如何绘制Nyquist曲线 提供三种绘制方法,其中使用最广泛的是概略图绘制方法 ①解析法绘制 ②概略图法绘制 ③MATLAB绘制 阅读详情

相关推荐

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4660

异常: org.apache.commons.beanutils.ConversionException: No value specified for ‘Date‘

1.背景:用BeanUtils将表单数据封装到javabean中,且表单中有带有日期格式数据; 2.异常位置: 3.异常原因: 封装的信息中有Date类型;而Date类型数据用BeanUtils类封装时,不能为null; 4.解决办法: 第一种:日期格式数据不能为null,那就赋个值; 第二种:添加转换器 //创建日期转换器对象 DateConverter converter = new DateConve...

拥抱白菜的猪博客 2199

Xilinx ZYNQ 7000学习笔记二(FSBL代码分析启动-汇编代码)

Xilinx ZYNQ 7000学习笔记

u011116085的博客 4246

org.apache.commons.beanutils.ConversionException: No value specified for 'Date'

环境:org.apache.commons.beanutils的版本号为1.8.3 出问题的代码: org.apache.commons.beanutils.converters.DateConverter dateConverter = new org.apache.commons.beanutils.converters.DateConverter(); dateConverter

linminqin的专栏 1万+

无监督低照度增强实战:用ZeroDCE和SCI拯救你的夜间照片(附PyTorch代码)

本文深入探讨了无监督低照度图像增强技术,重点解析了ZeroDCE和SCI两大代表性模型的核心原理与实战应用。通过对比分析两者的技术路径、网络结构及性能特点,并附上详细的PyTorch代码实现,旨在帮助读者掌握无需配对数据即可有效提升夜间照片画质的深度学习解决方案。

git9versioner的博客 490

利用ADS设计射频功率放大器

利用ADS设计射频功率放大器 任务: 用飞思卡尔公司的功率放大器芯片ATF27s006NT1设计射频功放,芯片频率范围可达450MHz-3.6GHz。 功放指标: (1) 工作频率:500MHz (2) 增益:G>20dB (3) 电源:+28V (4) 最大输出功率:2W(33dBm) 设计思路 (1)安装DesignKit模型; (2)直流DC扫描; (3)稳定性分析; (4)偏置电路设计及整...

UVM频率 3万+

使用BeanUtils时,Date类型值为空的解决方法

<br />org.apache.commons.beanutils.ConversionException: No value specified for 'Date'<br />现在系统里原先不出错的地方老是出现以上这个错误,不知道什么原因。也都是BeanUtils.copyProperties(teaInfo, infoForm);这种语句出的错。 <br />今天查了一上午,找到了它的用法,原来它是一种反射机制,使用copyProperties可以复制bean,不必重复写很多属性,只是效率不高。 <

simgsgkkk的专栏 999

YOLO11改进-注意力-引入Deformable Large Kernel Attention (DLKA) 解决多尺度、小目标、遮挡等问题

Deformable Large Kernel Attention (DLKA) 是一种用于视觉任务的注意力机制,旨在提升模型在处理不同尺寸和形状对象时的灵活性和性能。DLKA 的设计灵感源自传统的注意力机制,但通过引入可变形核(deformable kernel)来增强对局部特征的适应能力。

qq_64693987的博客 4042

BeanUtils和PropertyUtils区别

BeanUtils.copyProperties(distObj, srcObj);       // 支持属性类型自动转换的功能PropertyUtils.copyProperties(distObj, srcObj);  //不支持属性类型自动转换的功能 BeanUtils和PropertyUtils这两个类功能基本相同,唯一的区别是:BeanUtils在对Bean赋值时会进行类型转化

星星的技术专栏 7575

QGIS编译(跨平台编译)001:Flex、Bison编译(安装)(Windows、Linux、MacOS环境下安装)

QGIS编译;Flex、Bison编译(安装)(Windows、Linux、MacOS环境下安装)

LuckyHanMo的博客 3080

继电保护原理1.2-反时限过流保护

反时限过流保护

让你爱上电路设计 1万+

BeanUtils与PropertyUtils区别

BeanUtils与PropertyUtils区别以及java.util.Date发生异常问题: 除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功

youhan26的专栏 749

ENVI入门系列教程---一、数据预处理---1.1基本操作--5.x以后的界面(新界面)

every blog every motto: You never know how strong you really are until being strong is the only choice you have。 0. 前言 本系列教程旨在系统学习并梳理ENVI。说来惭愧,作为一名GISer,对ENVI这类软件还不能熟练掌握,这也是本系列教程的初衷。种一棵树最好的时间是十年以前,其次是...

胡侃有料的博客 1万+

BeanUtils和PropertyUtils的区别

BeanUtils中的describe方法,把一个对象生成Map结构,其中:key是对象的属性名,value是属性取值对象所得到的字符串,不能进行深层复制PropertyUtils中的describe方法,把一个对象生成Map结构,其中:key是对象的属性名,value仍然是属性的原始取值,不做字符串转换。换句话说,它是可以进行深层对象复制转换的。

Jeffrey's 专栏 1816

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

PropertyUtils.copyProperties和BeanUtils.copyProperties使用区别

位于org.apache.commons.beanutils包里面的这两个参数拷贝方法可以复制一个对象中相同名字的参数值到另一个对象,能简化很多代码,但是这两个copy方法使用起来有很大区别。 /** * 参数拷贝 * * @param dest 目标 * @param orig 数据源 * @author * */ public static void copyP

FreemanZhao的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

BeanUtils包的使用,主要是BeanUtils和PropertyUtils的区别

用BeanUtils工具包时,先要把两个Jar包进行Building Path,就是引入两个jar包, commons-beanutils.jar commons-logging-1.1.jar package com.base_super; import java.util.Date; import java.util.Map; import org.apache.commons.

知识搬运工,资料任你拿,包括书籍、电影、电视剧、网站、软件等,VX公人人人号:向前书局 4262

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

PropertyUtils与BeanUtils区别

使用 import org.apache.commons.beanutils.PropertyUtils; import org.springframework.beans.BeanUtils; 都是浅拷贝,BeanUtils.copyProperties提供类型转换功能,BeanUtils会调用默认的转换器(Converter)进行类型转换,所以在拷贝时能对八个基本类型间进行转换,不能转换时抛...

Mia的博客 1038

BeanUtils.copyProperties 与 PropertyUtils.copyProperties 用法及区别

BeanUtils.copyProperties 与 PropertyUtils.copyProperties 用法及区别 一、简介: BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。 我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆...

wzg0571的专栏 193

BeanUtils.copyProperties()与PropertyUtils.copyProperties()的区别

最近在项目中接触到了BeanUtils.copyProperties(),之前没怎么用过这个方法,在网上搜索了一下,发现还有一个PropertyUtils.copyProperties()的方法,下面对这两个方法做一下总结。另外,在使用的时候,程序抛出了异常,经过分析得知,异常的原因是因为赋值的对象中有一个时间类型(该属相采用java.util.Date的类型),程序无法通过,下面主要分析这两个问题。 通过反射将一个对象的值赋值个另外一个对象(前提是对象中属性的名字相同)。 BeanUtils.co

weixin_44073819的博客 351

拷贝相同属性的两个对象的属性-BeanUtils和PropertyUtils以及区别

使用这两个工具类需要引入的maven jar包依赖 <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version&...

ratel的博客 3790

BeanUtils与PropertyUtils区别以及java.util.Date发生异常问题

 BeanUtils与PropertyUtils区别以及java.util.Date发生异常问题:除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个

黄瓜和土豆的专栏 3797

工具类:BeanUtils和PropertyUtils的区别

相同点: 都是浅拷贝,都提供了copyProperties()方法,只要属性名相同就可以从源bean中拷贝值到目标bean中 不同点: BeanUtils.copyProperties(“转换后的类”, “要转换的类”); // 支持属性类型自动转换的功能 PropertyUtils.copyProperties(“转换后的类”, “要转换的类”); //不支持属性类型自动转换的功能,如果类型不同则会抛出异常 ...

ABCAA1024的博客 818

Apache:BeanUtils和PropertyUtils的区别

1.BeanUtils它以字符串的形式对javabean进行转换,而PropertyUtils是以原本的类型对javabean进行操作, 如果类型不对,就会有argument type mismatch异常。 2.PropertyUtils.getPropety方法获得的属性值的类型为该属性...

359

BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别

BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别 一、简介:BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含

好好学习,天天向上。 481
上一篇: Integer比较大小
下一篇: oracle 中 如何将某行的单元格数据拆分成多行记录
Java_yafeng
博客等级 码龄18年 2粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值