设为首页 收藏本站
查看: 842|回复: 0

[经验分享] 利用Apache BeanUtilsBean的copyProperties进行对象属性值copy

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2017-1-10 08:40:15 | 显示全部楼层 |阅读模式
  在开发中进行遇到值对象和实体间的数据复制.
  其中最常用的为Apache BeanUtilsBean的copyProperties.
  本次测试发现该工具可兼容大部分数据格式,但在Java.sql.Date和java.util.Date复制时,原数据如为空将发送报错.
  通过注册BeanUtilsBean的转换器,简单封装copyProperties方法.
  完成效果: 调用封装后的工具类方法复制对象属性时, 遇到Date数据一律给予新对象对应属性赋值为null.
  测试代码如下
  1.1 实体类Student

public class Student {
private int intValue;
private double doubleValue;
private long longValue0;
private boolean booleanValue0;
private Boolean booleanValue1;
private String strintValue;
private java.util.Date utilDateValue;
private java.sql.Date sqlDateValue;
private Integer IntegerValue;
private Long LongValue1;
private Teacher teacher;
//getter/setter
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public double getDoubleValue() {
return doubleValue;
}
public void setDoubleValue(double doubleValue) {
this.doubleValue = doubleValue;
}
public String getStrintValue() {
return strintValue;
}
public void setStrintValue(String strintValue) {
this.strintValue = strintValue;
}
public java.util.Date getUtilDateValue() {
return utilDateValue;
}
public void setUtilDateValue(java.util.Date utilDateValue) {
this.utilDateValue = utilDateValue;
}
public java.sql.Date getSqlDateValue() {
return sqlDateValue;
}
public void setSqlDateValue(java.sql.Date sqlDateValue) {
this.sqlDateValue = sqlDateValue;
}
public Integer getIntegerValue() {
return IntegerValue;
}
public void setIntegerValue(Integer integerValue) {
IntegerValue = integerValue;
}
public long getLongValue0() {
return longValue0;
}
public void setLongValue0(long longValue0) {
this.longValue0 = longValue0;
}
public Long getLongValue1() {
return LongValue1;
}
public void setLongValue1(Long longValue1) {
LongValue1 = longValue1;
}
public boolean isBooleanValue0() {
return booleanValue0;
}
public void setBooleanValue0(boolean booleanValue0) {
this.booleanValue0 = booleanValue0;
}
public Boolean getBooleanValue1() {
return booleanValue1;
}
public void setBooleanValue1(Boolean booleanValue1) {
this.booleanValue1 = booleanValue1;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}

  1.2 实体类teacher

public class Teacher {
private int id;
private String name;
//getter/setter
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}

  2 简单封装的工具类BeanUtilPlus1

package com.test.util;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
import org.apache.commons.beanutils.converters.SqlDateConverter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 继承apache的BeanUtils,避免调用copyProperties时因date为空而报错的情况
*/
public class BeanUtilPlus1 extends BeanUtils {
private static Map cache = new HashMap();
private static Log logger = LogFactory.getFactory().getInstance(
BeanUtilPlus1.class);
private BeanUtilPlus1() {
}
static {
//注册sql.date的转换器,即允许BeanUtils.copyProperties时的源目标的sql类型的值允许为空
ConvertUtils.register(new SqlDateConverter(null),  java.sql.Date.class);
//ConvertUtils.register(new SqlTimestampConverter(), java.sql.Timestamp.class);
//注册util.date的转换器,即允许BeanUtils.copyProperties时的源目标的util类型的值允许为空
ConvertUtils.register(new DateConverter(null), java.util.Date.class);
}
public static void copyProperties(Object target, Object source)
throws InvocationTargetException, IllegalAccessException {
//支持对日期copy
org.apache.commons.beanutils.BeanUtils.copyProperties(target, source);
}
}

  3 测试类testClient
  使用反射机制打印出对象的属性值

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.test.util.BeanUtilPlus1;
public class testClient {
/**
* 测试BeanUtilsBean.getInstance().copyProperties对数据进行赋值时候的效果
* java.sql.Date不可为空值
* java.util.Date不可为空值
*
* 使用改进的BeanUtilPlus1.copyProperties
* Date为空时,直接赋空值.
*/
public static void main(String[] args) {
/**
* 初始化数据
*/
Teacher t1=new Teacher();
t1.setId(1);
t1.setName("teacher t1");
Student s1=new Student();
s1.setBooleanValue0(true);
s1.setBooleanValue1(true);
s1.setDoubleValue(1.1);
s1.setIntegerValue(12);
s1.setIntValue(123);
s1.setLongValue0(12L);
s1.setLongValue1(2L);
//s1.setSqlDateValue(new java.sql.Date(new java.util.Date().getTime()));
//s1.setUtilDateValue(new java.util.Date());
s1.setStrintValue("student s1");
s1.setTeacher(t1);
try {
//打印出所有内容
Class c = Class.forName("Student");
//Object o = c.newInstance();
Object o=s1;
Method[] ms= c.getMethods();
//System.out.println(ms.length);
System.out.println("原始数据");
for(Method m:ms){
if( m.getName().contains("get")){
System.out.println("method  "+m.getName()+"  : ");
System.out.println(m.invoke(o));
}
}
} catch (Exception e) {
e.printStackTrace();
}
Student s2=new Student();
try {
//BeanUtilsBean.getInstance().copyProperties(s2, s1);  //调用copy方法
BeanUtilPlus1.copyProperties(s2,s1); //调用改写过的copy方法
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
try {
Class c = Class.forName("Student");
Object o=s2;
Method[] ms= c.getMethods();
System.out.println("新数据");
for(Method m:ms){
if( m.getName().contains("get")){
System.out.println("method  "+m.getName()+"  : ");
System.out.println(m.invoke(o));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326277-1-1.html 上篇帖子: xampp启动apache服务提示busy(笔记) 下篇帖子: Configure JBoss EAP 6 to Communicate with Apache Mod_jk
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表