`
agapple
  • 浏览: 1594943 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

BeanMapping发布1.0.2版本

阅读更多

背景

  BeanMapping是什么? 请查看我之前的一篇文章:  我也造了个轮子:BeanMapping(属性拷贝) 

版本变更内容

  1.   convetor包名重构,拼写错误
  2.   ScriptExecutor接口重构,加上ScriptContext操作
  3.   FiledSetExecutor去除对args的强制匹配依赖
  4.   mapping支持name定义
  5.   mapping支持嵌套映射/集合映射对象的name定义
  6.   增加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");
    }

后续计划:
  1. 支持object factory模式,允许自己控制嵌套对象的创建过程,目前默认是系统通过构造函数进行newInstance.
  2. 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在什么地方,首先得让别人能用起来,别人才能看源码,然后才能理解。

相关推荐

    香蕉招聘小程序源码 1.0.2版本全开源版简单实用、功能齐全的人才市场招聘模块

    功能有招牌工作,招牌信息发布,找人才,附加职位,找工作,发布职位等等香蕉招聘小程序 1.0.2版本全开源版简单实用、功能齐全的人才市场招聘模块 功能有招牌工作,招牌信息发布,找人才,附加职位,找工作,发布...

    OpenSSL dll 库1.0.2h版本

    OpenSSL 的版本通常按照主版本号、次版本号和修订号进行标识,如1.0.2h。在这个例子中,1代表主版本,0代表次版本,2是修订号,而'h'是一个内部版本标识,表示该版本修复了某些问题或添加了新功能。OpenSSL 1.0.2h ...

    unity塔防游戏Tower Offense Kit - City Under Siege 1.0.2版本,真正的精品塔防游戏

    unity塔防游戏Tower Offense Kit - City Under Siege 1.0.2版本,真正的精品塔防游戏 Unity精品小游戏源码 , Unity完整项目源码 是Unitypackage包 , 新建空项目直接导入到项目里面就可以运行了,无需其他操作。 适合...

    香蕉招聘小程序 1.0.2版本全开源版简单实用、功能齐全的人才市场招聘模块.rar

    《香蕉招聘小程序 1.0.2版本全开源版:构建高效人才市场招聘平台》 香蕉招聘小程序1.0.2版本是一款专为人才市场设计的全开源招聘模块,其核心在于提供简单实用且功能全面的招聘解决方案。该程序旨在帮助企业与求职...

    视频会议eStreamChat-1.0.2版本

    视频会议技术是现代远程协作的重要工具,eStreamChat-1.0.2版本是一个专为此目的设计的应用程序。它提供了一种高效、便捷的方式,使用户可以在不同的地理位置进行实时音视频交流,极大地促进了团队协作和沟通效率。 ...

    中兴E5501最新固件1.0.2版本

    首先,固件1.0.2的发布源于中兴论坛,这表明这是一个官方认可并经过社区验证的版本。社区的积极参与和反馈使得该固件具有较高的可靠性和兼容性,确保了用户在升级后的使用体验。 在功能优化方面,中兴E5501的1.0.2...

    openssl 1.0.2p源码

    1.0.2p 版本是 OpenSSL 1.0.2 分支的一个特定发布,包含了该分支线上的最新安全更新和改进。在本文中,我们将深入探讨 OpenSSL 1.0.2p 的核心概念、功能以及它对网络安全的重要性。 OpenSSL 提供了多种功能,包括但...

    Ubuntu16.04亲测openssl-1.0.2r.tar包,好使!

    2. **Ubuntu 16.04 LTS**: 这是一个长期支持(LTS)版本的Ubuntu操作系统,发布于2016年,提供长达五年的安全更新和支持。 3. **环境配置**: 在Ubuntu上安装openssl通常涉及以下步骤: - 安装依赖:`sudo apt-get ...

    Mondrian schema编辑器插件1.0.2版本.zip

    mondrian-schema-editor-plugin-v1.0.2.zip 文件是一个包含Mondrian Schema编辑器插件的更新版本,版本号为1.0.2。Mondrian是一款开源的关系型多维数据集引擎,常用于在线分析处理(OLAP)系统,它能够解析和执行SQL...

    openssl 1.0.2静态lib库 windows

    OpenSSL 1.0.2 版本是一个较老但广泛使用的版本,它支持多种加密算法,如AES、DES、RSA、DSA等,这些算法在网络安全中起到至关重要的作用。在Windows上构建静态库,开发者需要下载OpenSSL的源代码,配置编译环境...

    scikit-learn-1.0.2.tar.gz

    1.0.2是这个库的一个特定版本,它包含了自上次更新以来的一系列改进、修复和新特性。在本篇文章中,我们将深入探讨scikit-learn 1.0.2的核心功能、安装方法以及它在深度学习和数据科学中的应用。 首先,scikit-...

    SnSitesV1.0.2共享版本

    SnSitesV1.0.2 1,修正后台配置方式为模板功能; 2,加入页面ASP解码功功能; 3,加入页面函数功能; 4,修正区域结构代码为区域结构模板; 5,加入小冲量缓存技术; 6,修正用户管理平台界面; 7,修正前台全部执行程序...

    ZebraDesigner 1.0.2

    1.0.2版本是该软件的一个早期版本,虽然不是Pro版,但依然包含了基本的标签设计功能。 **二、主要功能** 1. **条形码生成**:ZebraDesigner支持多种条形码格式,如Code 39、Code 128、EAN、UPC等,用户可以根据需要...

    scikit_learn-1.0.2-cp39-cp39-win_amd64.zip

    Scikit-learn是Python编程语言中的一个强大机器学习库,其1.0.2版本针对Python 3.9编译并适用于Windows x64架构的系统。这个压缩包`scikit_learn-1.0.2-cp39-cp39-win_amd64.zip`包含了scikit-learn的whl文件,这是...

    windowsOpenssl1.0.2和1.1.0

    1.1.0 版本包含了自 1.0.2 发布以来的所有安全补丁,因此,对于需要最新安全性的项目,升级到 1.1.0 是必要的。 5. **配置和编译**:1.1.0 版本的编译和配置过程可能有所不同,包括新的选项和默认设置,这可能影响...

    openssl-1.0.2u + openssl-1.0.2k

    这些版本号代表了OpenSSL软件在特定时间点的稳定发布。 描述中的"openssl-1.0.2u + openssl-1.0.2k的rpm包"表明这些是针对RPM(Red Hat Package Manager)系统的软件包。RPM是一种广泛使用的Linux软件包管理器,...

    openssl-1.0.2

    OpenSSL 1.0.2 发布于2014年,是 OpenSSL 的一个长期支持(LTS)版本。它经历了多个子版本的迭代,如 1.0.2d,这个版本通常会修复已知的安全漏洞,增强性能,以及添加新的特性。OpenSSL 1.0.2 在整个生命周期中对...

    openssl-1.0.2j_win64

    1.0.2j是1.0.2系列中的一个稳定版本,发布于2016年9月,旨在提供可靠的SSL/TLS加密支持。 描述中提到的SDK(Software Development Kit),是一个包含了开发人员构建应用程序所需工具和资源的集合。对于OpenSSL ...

    keilL1板子支持包,1.0.2版本、1.1.0版本、1.2.0版本

    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.2o版本的32位动态库

    OpenSSL-1.0.2o 是该库的一个特定版本,发布于2018年,包含了对已知安全漏洞的修复和一些性能优化。使用这个版本意味着你的应用程序将受益于这些改进,同时需要注意的是,较旧的版本可能会有尚未解决的安全问题,...

Global site tag (gtag.js) - Google Analytics