- 浏览: 1583701 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
jsrgzhangzhiyong:
关于null值的转换还是感觉不太友好,就像 mapstruct ...
我也造了个轮子:BeanMapping(属性拷贝) -
he037:
a417930422 写道引用使用EPHEMERAL会引出一个 ...
基于zookeeper的分布式lock实现 -
seancheer:
qianshangding 写道首先节点启动后,尝试读取本地的 ...
zookeeper学习记录三(session,watcher,persit机制) -
雪夜归人:
您好,我想咨询一下,开源的canal都能支持mysql的哪些版 ...
Canal BinlogChange(mysql5.6) -
zhoudengyun:
copy 一份做记录,后续学习,请知悉
阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费
背景
BeanMapping是什么? 请查看我之前的一篇文章: 我也造了个轮子:BeanMapping(属性拷贝)
版本变更内容
- convetor包名重构,拼写错误
- ScriptExecutor接口重构,加上ScriptContext操作
- FiledSetExecutor去除对args的强制匹配依赖
- mapping支持name定义
- mapping支持嵌套映射/集合映射对象的name定义
- 增加NullSymbolGetExecutor的实现,支持无源属性的映射
相比于 BeanMapping发布1.0.1版本,主要增加的两个特性:
特性1:mapping支持别名定义
可以解决的需求:
- map<->map之间可以有不同的映射规则,服务化接口用map这样弱类型的情况会比较多.
- 嵌套映射,集合映射都可以指定特定的映射规则,改变原先的默认按照class类型查找的方式
@Test public void testCollectionAndNestedNameMapping() {// 测试嵌套collection mapping处理 BeanMappingBuilder builder = new BeanMappingBuilder() { protected void configure() { behavior().debug(true);// 设置行为 mapping(HashMap.class, HashMap.class); fields(srcField(ONE, String.class), targetField(ONE_OTHER, BigInteger.class)); fields(srcField(TWO, List.class).componentClasses(HashMap.class), targetField(TWO_OTHER, List.class).componentClasses(HashMap.class)).nestName("nestedMapping"); } }; // 第三层mapping final BeanMappingBuilder nextNestedMapping = new BeanMappingBuilder() { protected void configure() { behavior().debug(true);// 设置行为 mapping("nextNestedMapping", HashMap.class, HashMap.class); fields(srcField(THREE), targetField(THREE_OTHER)); } }; // 第二层mapping BeanMappingBuilder nestedMapping = new BeanMappingBuilder() { protected void configure() { behavior().debug(true);// 设置行为 mapping("nestedMapping", HashMap.class, HashMap.class); fields(srcField(TWO), targetField(TWO_OTHER)); fields(srcField(THREE), targetField(THREE_OTHER)).recursiveMapping(true).nestObject(nextNestedMapping); } }; BeanMappingConfigHelper.getInstance().register(nextNestedMapping); BeanMappingConfigHelper.getInstance().register(nestedMapping); BeanMappingConfigHelper.getInstance().register(builder); BeanMapping mapping = new BeanMapping(builder); Map nextNestedMap1 = new HashMap(); nextNestedMap1.put(THREE, "nextNestedMap three1"); Map nestedMap1 = new HashMap(); nestedMap1.put(TWO, "nestedMap two1"); nestedMap1.put(THREE, nextNestedMap1); Map nextNestedMap2 = new HashMap(); nextNestedMap2.put(THREE, "nextNestedMap three2"); Map nestedMap2 = new HashMap(); nestedMap2.put(TWO, "nestedMap two2"); nestedMap2.put(THREE, nextNestedMap2); Map src = new HashMap(); src.put(ONE, "10"); src.put(TWO, Arrays.asList(nestedMap1, nestedMap2)); // 映射集合 Map dest = new HashMap(); mapping.mapping(src, dest); assertEquals(dest.get(ONE_OTHER), BigInteger.valueOf(10)); List nestedOtherMap = (List) dest.get(TWO_OTHER); assertEquals(nestedOtherMap.size(), 2); Map nestedOtherMap1 = (Map) nestedOtherMap.get(0); assertEquals(nestedOtherMap1.get(TWO_OTHER), "nestedMap two1"); Map nextNestedOtherMap1 = (Map) nestedOtherMap1.get(THREE_OTHER); assertEquals(nextNestedOtherMap1.get(THREE_OTHER), "nextNestedMap three1"); Map nestedOtherMap2 = (Map) nestedOtherMap.get(1); assertEquals(nestedOtherMap2.get(TWO_OTHER), "nestedMap two2"); Map nextNestedOtherMap2 = (Map) nestedOtherMap2.get(THREE_OTHER); assertEquals(nextNestedOtherMap2.get(THREE_OTHER), "nextNestedMap three2"); }
特性2:script上下文隔离
可以解决的需求:
- 在嵌套映射时,在子映射时需要访问parent映射时的script context,不同映射时又需要保持隔离。简单点说:就是在一个映射过程,包括嵌套的递归映射都可以共享一个script context,通过el表达式可以正确访问
特性3:支持null symbol
可以解决的需求:
- 强制设置目标的某属性为null
- 源属性不存在,针对目标对象的属性进行赋值操作。 比如给目标属性设置初始默认值
testcase:
@Test public void testNullSymbol() { // 测试下null的特殊属性 BeanMappingBuilder builder = new BeanMappingBuilder() { protected void configure() { behavior().debug(true).mappingEmptyStrings(false).mappingNullValue(false).trimStrings(true);// 设置行为 mapping(HashMap.class, HashMap.class); fields(srcField("null"), targetField(ONE_OTHER, String.class)).defaultValue("10"); } }; BeanMapping mapping = new BeanMapping(builder); Map dest = new HashMap(); mapping.mapping(new HashMap(), dest); assertEquals(dest.get(ONE_OTHER), "10"); }
后续计划:
- 支持object factory模式,允许自己控制嵌套对象的创建过程,目前默认是系统通过构造函数进行newInstance.
- fel script实现支持 (http://www.iteye.com/news/24711-Fel-java-script)
目前在阿里公司内部正在逐步使用,也欢迎大家试用和给我提需求,可以非常方便的替换原先的BeanUtils,性能上也会有一定的惊喜。
评论
4 楼
agapple
2014-07-10
zhaoshun0417 写道
哪里最新代码下载?
https://github.com/alibaba/tamper
3 楼
zhaoshun0417
2014-07-10
哪里最新代码下载?
2 楼
agapple
2013-03-05
sunjiyun26 写道
说实话,我看了,找了半天找不到demo在什么地方,api在什么地方,首先得让别人能用起来,别人才能看源码,然后才能理解。
demo都是在testcase中,需要习惯看testcase哈
比如:
case 1 : 类似cglib的BeanCopier 或者 BeanUtils.copy()的功能,同名属性之间的映射
https://github.com/alibaba/tamper/blob/master/src/test/java/com/alibaba/tamper/BeanCopyTest.java
case 2 : 类似BeanUtils.describe() / BeanUtils.populate()的功能,将bean和map对象进行互转
https://github.com/alibaba/tamper/blob/master/src/test/java/com/alibaba/tamper/BeanMapTest.java
case 3 : 自己的特色,定义映射规则,比如属性名不同,类型不同,默认值,字符串是否trim处理,集合递归转化等。
https://github.com/alibaba/tamper/blob/master/src/test/java/com/alibaba/tamper/BeanMappingTest.java
对应的配置文件:
https://github.com/alibaba/tamper/blob/master/src/test/resources/mapping/mapping.xml
最后,工程的UserGuide和ProgramGuide
https://github.com/alibaba/tamper/wiki/UserGuide,详细介绍具体映射规则的配置方法,包括递归转化,集合内部类型转化等
https://github.com/alibaba/tamper/wiki/ProgramGuide
1 楼
sunjiyun26
2013-03-05
说实话,我看了,找了半天找不到demo在什么地方,api在什么地方,首先得让别人能用起来,别人才能看源码,然后才能理解。
发表评论
-
yugong QuickStart
2016-03-05 01:52 0几点说明 a. 数据迁移的方案可参见设计文档,oracl ... -
阿里巴巴开源项目: 阿里巴巴去Oracle数据迁移同步工具
2016-03-05 18:29 6344背景 08年左右,阿里巴巴开始尝试MySQL的相关 ... -
愚公performance
2016-03-02 17:29 0性能测试 全量测试 场景1 (单主键, ... -
yugong AdminGuide
2016-03-02 16:40 0环境要求 操作系统 数据库 迁移方案 部署 ... -
Tddl_hint
2014-01-27 13:52 0背景 工作原理 Hint格式 direct模 ... -
tddl5分库规则
2014-01-26 14:41 0背景 工作原理 构建语法树 元数据 基于 ... -
tddl5优化器
2014-01-22 15:12 0背景 工作原理 构建语法树 元数据 抽象语 ... -
Canal BinlogChange(mariadb5/10)
2014-01-20 17:25 4448背景 先前开源了一个 ... -
asynload quickstart
2013-10-08 22:49 0几点说明: 1. asyncload是做为一个j ... -
映射规则配置
2013-09-26 11:25 0背景 因为alibaba的特殊业务,比如: 同 ... -
网友文档贡献
2013-09-18 15:50 01. Otter源代码解析系列 链接:http://e ... -
Manager配置介绍
2013-09-16 13:00 0通道配置说明 多种同步方式配置 a. 单向同步 ... -
canal&otter FAQ
2013-09-05 17:30 0常见问题 1. canal和 ... -
阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
2013-08-22 16:48 40211项目背景 阿里巴巴B2B公司,因为业务的特性 ... -
Otter AdminGuide
2013-08-19 11:06 0几点说明 otter系统自带了manager,所以简化了一 ... -
Otter高可用性
2013-08-17 23:41 0基本需求 网络不可靠,异地机房尤为明显. man ... -
Otter数据一致性
2013-08-17 23:39 0技术选型分析 需要处理一致性的业务场景: 多地修改 ( ... -
Otter扩展性
2013-08-17 22:20 0扩展性定义 按照实现不同,可分为两类: 数据处理自定 ... -
Otter双向回环控制
2013-08-17 21:37 0基本需求 支持mysql/oracle的异构数据库的双 ... -
Otter调度模型
2013-08-17 20:13 0背景 在介绍调度模型之前,首先了解一下otter系统要解 ...
相关推荐
功能有招牌工作,招牌信息发布,找人才,附加职位,找工作,发布职位等等香蕉招聘小程序 1.0.2版本全开源版简单实用、功能齐全的人才市场招聘模块 功能有招牌工作,招牌信息发布,找人才,附加职位,找工作,发布...
蒲公英1.0.2版本需求.docx
unity塔防游戏Tower Offense Kit - City Under Siege 1.0.2版本,真正的精品塔防游戏 Unity精品小游戏源码 , Unity完整项目源码 是Unitypackage包 , 新建空项目直接导入到项目里面就可以运行了,无需其他操作。 适合...
视频会议eStreamChat-1.0.2版本
Mondrian schema编辑器插件1.0.2版本.zip
唯品会Java开发手册 1.0.2版本,是唯品会结合阿里巴巴Java开发手册,并参考Clean Code、Effective Java等资料增补和精简而成。
香蕉招聘小程序 1.0.2版本全开源版简单实用、功能齐全的人才市场招聘模块 功能有招牌工作,招牌信息发布,找人才,附加职位,找工作,发布职位等等
SnSitesV1.0.2 1,修正后台配置方式为模板功能; 2,加入页面ASP解码功功能; 3,加入页面函数功能; 4,修正区域结构代码为区域结构模板; 5,加入小冲量缓存技术; 6,修正用户管理平台界面; 7,修正前台全部执行程序...
KEILL1XX板载支持包,包含Keil.STM32L1xx_DFP.1.0.2.pack、Keil.STM32L1xx_DFP.1.2..pack、Keil.STM32L1xx_DFP.1.2.0.pack,支持新老版本Keil客户端
openssl-1.0.2h编译的win32的动态库和静态库,可以正常使用
VCE模拟考试软件V1.0.2,最经典好用的版本,模拟考试软件,可以制作VCE题库,可以使用VCE格式题库,进行模拟考试,考试认证必备软件。
中兴论坛流出的固件,亲自刷非常稳定,速度很快,无线信号强大,用斐讯FIR300M/FIR302M硬改过E5501的试下吧
openssl1.0.2源代码,目前1.0.2分支最高版本 支持openssh
该代码是VLC-1.0.2的源代码,经过编译的,是在cygwin平台上进行的编译
apache-storm-1.0.2
STM32CubeIDE软件安装包,ST官网下载的,该版本为Windows平台版本,支持x86或者x64,v1.0.2版本,分享给小伙伴们,共同进步
openssl 1.0.2q版本在windows 的VS2013下编译的库,有静态库和动态库,32位与64位的。想要的自取。想了解如何编译的,可以私信或者邮件(wangshenggui1985@163.com)给我
openssl-1.0.2u + openssl-1.0.2k的rpm包
OpenSSL dll 库1.0.2h版本32位和64位库.请注意:名称是一样的,但是大小不一样.
jave 1.0.2 绝对 可用 解压 即可