`
nannan408
  • 浏览: 1795669 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

架构师之bean---------------bean之间的数据copy

 
阅读更多
1.前言.
   如题,bean不能强转,只能对应转换.一共有三种常用方法.
2.代码.
  (1)BeanCopier
public class AccountEntity {
	private int id;
	private Timestamp createTime;
	private BigDecimal balance;
	// Getters and setters are omitted
}
public class AccountDto {
	private int id;
	private String name;
	private String createTime;
	private String balance;
	// Getters and setters are omitted
}
public class BeanCopierConverterTest {

	@Test
	public void noConverterTest() {
		AccountEntity po = new AccountEntity();
		po.setId(1);
		po.setCreateTime(new Timestamp(10043143243L));
		po.setBalance(BigDecimal.valueOf(4000L));
		BeanCopier copier = BeanCopier.create(AccountEntity.class, AccountDto.class, false);
		AccountDto dto = new AccountDto();
		copier.copy(po, dto, null);
		Assert.assertNull(dto.getCreateTime()); // 类型不同,未拷贝
		Assert.assertNull(dto.getBalance()); // 类型不同,未拷贝
	}
}

(2)Converter
package net.sf.cglib.core;

public interface Converter {
    // value 源对象属性,target 目标对象属性类,context 目标对象setter方法名
    Object convert(Object value, Class target, Object context);
}

	@Test
	public void converterTest() {
		AccountEntity po = new AccountEntity();
		po.setId(1);
		po.setCreateTime(Timestamp.valueOf("2014-04-12 16:16:15"));
		po.setBalance(BigDecimal.valueOf(4000L));
		BeanCopier copier = BeanCopier.create(AccountEntity.class, AccountDto.class, true);
		AccountConverter converter = new AccountConverter();
		AccountDto dto = new AccountDto();
		copier.copy(po, dto, converter);
		Assert.assertEquals("2014-04-12 16:16:15", dto.getCreateTime());
		Assert.assertEquals("4000", dto.getBalance());
	}

	static class AccountConverter implements Converter {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		@SuppressWarnings("rawtypes")
		@Override
		public Object convert(Object value, Class target, Object context) {
			if (value instanceof Integer) {
				return (Integer) value;
			} else if (value instanceof Timestamp) {
				Timestamp date = (Timestamp) value;
				return sdf.format(date);
			} else if (value instanceof BigDecimal) {
				BigDecimal bd = (BigDecimal) value;
				return bd.toPlainString();
			}
			return null;
		}
	}


(3)自己写方法fieldName

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;

public class Parameter2JavaBean {
	/**
	 * 把req中的数据按照对象的属性取出来并set到对象当中并返回 * 
	 */
	public static <E> E setParameter2JavaBean(HttpServletRequest req, E e) {
		Class<?> clazz = e.getClass();
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {
			Class<?> typeClass = field.getType();
			String value = req.getParameter(field.getName());
			if (value != null && !"".equals(value)) {
				setValue(e, clazz, field, typeClass, value);
			}
		}
		return e;
	}

	/**
	 * 调用set方法把值set到对象当中 * 
	 * @param obj 指定对象 * @param
	 *  clazz 对象的class * 
	 *  @param field 需要设置值的field对象 *
	 *   @param typeClass field的类型的class *
	 *    @param value 对应的值
	 * @param e
	 * @return
	 */
	private static void setValue(Object obj, Class<?> clazz, Field field,
			Class<?> typeClass, String value) {
		String fieldName = field.getName();
		String methodName = "set" + fieldName.substring(0, 1).toUpperCase()
				+ fieldName.substring(1);
		try {
			Method method = clazz.getDeclaredMethod(methodName,
					new Class[] { typeClass });
			method.invoke(obj,
					new Object[] { getClassTypeValue(typeClass, value) });
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}
	private static Object getClassTypeValue(Class<?> typeClass, String value) {
		if (typeClass == int.class) {
			if (value.equals("")) {
				return 0;
			}
			return Integer.parseInt(value);
		} else if (typeClass == short.class) {
			if (value.equals("")) {
				return 0;
			}
			return Short.parseShort(value);
		} else if (typeClass == byte.class) {
			if (value.equals("")) {
				return 0;
			}
			return Byte.parseByte(value);
		} else if (typeClass == double.class) {
			if (value.equals("")) {
				return 0;
			}
			return Double.parseDouble(value);
		} else if (typeClass == boolean.class) {
			if (value.equals("")) {
				return false;
			}
			return Boolean.parseBoolean(value);
		} else if (typeClass == float.class) {
			if (value.equals("")) {
				return 0;
			}
			return Float.parseFloat(value);
		} else if (typeClass == long.class) {
			if (value.equals("")) {
				return 0;
			}
			return Long.parseLong(value);
		} else {
			return typeClass.cast(value);
		}
	}
}



3.注意.
   推荐用第一种,没有的属性是null.
分享到:
评论

相关推荐

    Linux高级架构师12期-视频教程网盘链接提取码下载.txt

    L001-高级架构师12期-zabbix深度实践-13节 L002-高级架构师12期-zabbix深度实践2-2节 L003-高级架构师12期-SaltStack深度实践1-4节 L004-1-高级架构师12期-Saltstack配置管理2-8节 L004-2-高级架构师12期-Saltstack...

    系统架构设计师2009-2018真题及答案

    51CTO系统架构设计师2009-2018真题及答案,好用、专业

    架构师职能图------------

    架构师职能图----------------------------------

    架构师学习指南-高级架构师必修学习视频

    架构师学习指南-高级架构师必修学习视频架构师学习指南-高级架构师必修学习视频

    00000033_bean-struts的用法.rar

    Bean-Struts框架是Apache Struts的扩展,它强调了业务逻辑层与视图层之间的数据交换,通过JavaBeans作为数据载体,实现了模型与视图的解耦。这一框架的核心思想在于,将应用程序的控制流程和业务逻辑分离,使得...

    软考:系统架构师1-知识结构.png

    系统架构师1-知识结构.png软考:系统架构师1-知识结构.png软考:系统架构师1-知识结构.png软考:系统架构师1-知识结构.png软考:系统架构师1-知识结构.png软考:系统架构师1-知识结构.png软考:系统架构师1-知识结构...

    高软-系统架构设计师-考点整理

    高软-系统架构设计师-考点整理 高软-系统架构设计师-考点整理高软-系统架构设计师-考点整理高软-系统架构设计师-考点整理高软-系统架构设计师-考点整理高软-系统架构设计师-考点整理高软-系统架构设计师-考点整理高...

    软考-高级—系统架构师-2009-2017真题(上午-下午)

    软考-高级—系统分析师-2009-2017真题(上午-下午) 含有答案 word版本 超值! Word版本 ---------------------------包含答案---------------------------- ---------------------------花钱买的,绝对值----------...

    系统架构设计师教程-第4版

    《系统架构设计师教程-第4版》是一本深入探讨系统架构设计的专业教程,适用于准备进行系统架构设计学习或备考系统架构设计师资格认证的读者。本书全面涵盖了系统架构设计的基础理论、核心概念、最佳实践以及最新技术...

    web-bean-1.0.pdf

    - **合同**:Web Bean 规定了容器与 Bean 之间的交互模式,包括 Bean 的创建、销毁以及依赖注入等操作。 - **与其他规范的关系**: - **与 Java EE 平台的关系**:Web Bean 是 Java EE 6 的一部分,其目标是在 Java...

    openssh-centos7-9.5p1-ssh-copy-id-rpm.tgz

    适用于centos 7 redhat 7 x86架构操作系统使用的openssh 9.5 p1 二进制rpm包 带有ssh-copy-id命令,2023年10月4日发布,当前最新版本,修复安全漏洞,更新升级openssh版本

    JSP-Bean-Servlet.zip_java web servlet_java+web+servlet_jdp bean

    在这个项目中,`JSP-Bean-Servlet`很可能包含了一个或多个JSP文件,用于展示用户界面,并调用JavaBeans来处理数据和业务逻辑。 JavaBeans是Java编程中的一个核心概念,它是一种符合JavaBeans规范的Java类,具有属性...

    软考-系统架构师(2006-2017)年真题+答案

    系统架构师历年(2006-2017)真题+答案,希望能帮到广大的考证人群,共同考上系统架构师

    openssh-9.7p1-1.el7.x86-64-ssh-copy-id.tgz

    适用于centos 7 redhat 7 x86架构操作系统升级更新openssh 9.7 版本,修复安全漏洞 此包为二进制rpm包,包含ssh-copy-id命令 2024年3月11日 官方发布9.7版本,此包基于官方源码制作,无ssl信息显示。

    2.分布式数据库架构及企业实践-基于Mycat中间件

    分布式数据库架构及企业实践-基于Mycat中间件分布式数据库架构及企业实践-基于Mycat中间件分布式数据库架构及企业实践-基于Mycat中间件分布式数据库架构及企业实践-基于Mycat中间件分布式数据库架构及企业实践-基于...

    openssh-9.7p1-1.el7.x86-64-ssh-copy-id-openssl.tgz

    适用于centos 7 redhat 7 x86架构的二进制openssh rpm包,版本9.7p1 2024年3月11日官方发布9.7版本,内含ssh-copy-id命令,安装后显示openssl版本,此包基于openssl 1.1.1w制作,因此安装后会显示1.1.1w版本的...

    bean-validator.jar貌似最低2分,想免费分享来着

    《Bean Validator:构建Java Bean验证框架的基石》 在Java开发中,数据验证是一个不可或缺的环节,它确保了输入的数据符合预期的格式和规则,从而防止了潜在的错误和异常。Bean Validator,作为Java Bean验证的标准...

    2015中国系统架构师大会演讲PPT-最终版

    - 架构师需要考虑的方面包括但不限于数据安全、系统冗余、负载均衡、数据备份与恢复、服务的高可用性和灾难恢复计划。 2. 技术选型 - PPT中提到了Golang、AngularJS、Node.js等技术栈,这些都是互联网公司常用的...

Global site tag (gtag.js) - Google Analytics