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类型查找的方式

testcase :  https://raw.github.com/agapple/mapping4java/master/src/test/java/com/agapple/mapping/BeanMappingNestAndNameTest.java

1.@Test
2.    public void testCollectionAndNestedNameMapping() {// 测试嵌套collection mapping处理
3.        BeanMappingBuilder builder = new BeanMappingBuilder() {
4.
5.            protected void configure() {
6.                behavior().debug(true);// 设置行为
7.                mapping(HashMap.class, HashMap.class);
8.                fields(srcField(ONE, String.class), targetField(ONE_OTHER, BigInteger.class));
9.                fields(srcField(TWO, List.class).componentClasses(HashMap.class),
10.                       targetField(TWO_OTHER, List.class).componentClasses(HashMap.class)).nestName("nestedMapping");
11.            }
12.
13.        };
14.
15.        // 第三层mapping
16.        final BeanMappingBuilder nextNestedMapping = new BeanMappingBuilder() {
17.
18.            protected void configure() {
19.                behavior().debug(true);// 设置行为
20.                mapping("nextNestedMapping", HashMap.class, HashMap.class);
21.                fields(srcField(THREE), targetField(THREE_OTHER));
22.            }
23.
24.        };
25.
26.        // 第二层mapping
27.        BeanMappingBuilder nestedMapping = new BeanMappingBuilder() {
28.
29.            protected void configure() {
30.                behavior().debug(true);// 设置行为
31.                mapping("nestedMapping", HashMap.class, HashMap.class);
32.                fields(srcField(TWO), targetField(TWO_OTHER));
33.                fields(srcField(THREE), targetField(THREE_OTHER)).recursiveMapping(true).nestObject(nextNestedMapping);
34.            }
35.
36.        };
37.
38.        BeanMappingConfigHelper.getInstance().register(nextNestedMapping);
39.        BeanMappingConfigHelper.getInstance().register(nestedMapping);
40.        BeanMappingConfigHelper.getInstance().register(builder);
41.
42.        BeanMapping mapping = new BeanMapping(builder);
43.        Map nextNestedMap1 = new HashMap();
44.        nextNestedMap1.put(THREE, "nextNestedMap three1");
45.
46.        Map nestedMap1 = new HashMap();
47.        nestedMap1.put(TWO, "nestedMap two1");
48.        nestedMap1.put(THREE, nextNestedMap1);
49.
50.        Map nextNestedMap2 = new HashMap();
51.        nextNestedMap2.put(THREE, "nextNestedMap three2");
52.
53.        Map nestedMap2 = new HashMap();
54.        nestedMap2.put(TWO, "nestedMap two2");
55.        nestedMap2.put(THREE, nextNestedMap2);
56.
57.        Map src = new HashMap();
58.        src.put(ONE, "10");
59.        src.put(TWO, Arrays.asList(nestedMap1, nestedMap2)); // 映射集合
60.
61.        Map dest = new HashMap();
62.        mapping.mapping(src, dest);
63.        assertEquals(dest.get(ONE_OTHER), BigInteger.valueOf(10));
64.
65.        List nestedOtherMap = (List) dest.get(TWO_OTHER);
66.        assertEquals(nestedOtherMap.size(), 2);
67.
68.        Map nestedOtherMap1 = (Map) nestedOtherMap.get(0);
69.        assertEquals(nestedOtherMap1.get(TWO_OTHER), "nestedMap two1");
70.        Map nextNestedOtherMap1 = (Map) nestedOtherMap1.get(THREE_OTHER);
71.        assertEquals(nextNestedOtherMap1.get(THREE_OTHER), "nextNestedMap three1");
72.
73.        Map nestedOtherMap2 = (Map) nestedOtherMap.get(1);
74.        assertEquals(nestedOtherMap2.get(TWO_OTHER), "nestedMap two2");
75.        Map nextNestedOtherMap2 = (Map) nestedOtherMap2.get(THREE_OTHER);
76.        assertEquals(nextNestedOtherMap2.get(THREE_OTHER), "nextNestedMap three2");
77.    }

特性2:script上下文隔离

可以解决的需求:

  • 在嵌套映射时,在子映射时需要访问parent映射时的script context,不同映射时又需要保持隔离。简单点说:就是在一个映射过程,包括嵌套的递归映射都可以共享一个script context,通过el表达式可以正确访问

特性3:支持null symbol

可以解决的需求:

  • 强制设置目标的某属性为null
  • 源属性不存在,针对目标对象的属性进行赋值操作。 比如给目标属性设置初始默认值

testcase: 

1.@Test
2.    public void testNullSymbol() { // 测试下null的特殊属性
3.        BeanMappingBuilder builder = new BeanMappingBuilder() {
4.
5.            protected void configure() {
6.                behavior().debug(true).mappingEmptyStrings(false).mappingNullValue(false).trimStrings(true);// 设置行为
7.                mapping(HashMap.class, HashMap.class);
8.                fields(srcField("null"), targetField(ONE_OTHER, String.class)).defaultValue("10");
9.            }
10.
11.        };
12.
13.        BeanMapping mapping = new BeanMapping(builder);
14.        Map dest = new HashMap();
15.        mapping.mapping(new HashMap(), dest);
16.        assertEquals(dest.get(ONE_OTHER), "10");
17.    }

后续计划:

  1. 支持object factory模式,允许自己控制嵌套对象的创建过程,目前默认是系统通过构造函数进行newInstance.
  2. fel script实现支持 (http://www.iteye.com/news/24711-Fel-java-script)

目前在阿里公司内部正在逐步使用,也欢迎大家试用和给我提需求,可以非常方便的替换原先的BeanUtils,性能上也会有一定的惊喜。

时间: 2025-01-02 14:01:41

BeanMapping发布1.0.2版本的相关文章

BeanMapping发布1.0.1版本

背景   BeanMapping是什么? 请查看我之前的一篇文章:  我也造了个轮子:BeanMapping(属性拷贝)  现状   目前代码经过在一个实际项目中进行试用,该项目为公司的核心业务逻辑(产品页面数据),目前表现良好.      在原先的1.0.0版本基础上修复了几个bug,目前推荐使用1.0.1.  下载 url : https://github.com/agapple/mapping4java/tags mvn仓库: 1. <dependency> 2. <groupId

易信发布2.0全新版本新增免费通话功能

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 1月22日,中国电信和网易联合推出的"易信"正式发布2.0新版本,新版本最大变化是增加了免费通话功能,不限国内国外,在网络条件通畅的情况下所有地区均可使用,通过该功能,易信好友间可直接进行通话. 图1易信新版本--免费通话界面 据易信相关负责人介绍,易信的免费通话即通过网络数据交换进行语音通话.目前Android用户已可升级新版本进行体验,iOS版本也已提交审核,预计将很快发布. 图2易信对话界面新增免费通话按钮 据介绍,易信新版

【软件周刊第 31 期】Node.js 发布 v8.0.0 正式版;Qt 5.9 正式发布,长期支持版本

摘要: 软件周刊(05.28 - 06.03):本周热门软件更新 - Node.js 发布 v8.0.0 正式版:npm v5.0.0 正式发布,改进了稳定性:Qt 5.9 正式发布,长期支持版本:Dotty 0.1.2-RC1 发布,Scala 的下一代编译器:Linux Mint 18.2 Sonya 将于 6 月上旬发布公测版本 Node.js 发布 v8.0.0 正式版 新版带来了一系列重大的变化和新功能,Node.js v8 将在 2017 年 10 月进入长期支持(LTS)版本阶段.

基于Web的3D绘图标准-WebGL发布1.0版本

Khronos 组织在http://www.aliyun.com/zixun/aggregation/5469.html">游戏开发者大会发布了 WebGL 规范 1.0 正式版本,该版本带来了全新的 OpenGL ES 2.0,使得浏览器可通过 HTML5 和 JavaScript 进行识别,这表明 WebGL 将逐渐进入我们的视野.WebGL 是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个J

MessagePack 的 C 实现发布 1.0.0 版本

MessagePack 的 C 实现发布 1.0.0 版本 MessagePack是一个基于二进制高效的对象序列化类库,可用于跨语言通信.它可以像JSON那样,在许多种语言之间交换结构对象:但是它比JSON更快速也更轻巧.支持Python.Ruby.Java.C/C++等众多语言.比Google Protocol Buffers还要快4倍. 示例代码: #include <msgpack.h> #include <stdio.h> int main(void) { / msgpac

xmemcached发布1.0版本

xmemcached发布1.0稳定版,下载地址这里.     相比于1.0-beta版本,这个released版本的主要改进如下: 1.xmemcached跟yanf4j都是默认采用common-logging,你可以使用log4j,也可以默认使用jdk的日志库.1.0添加了log4j的配置和依赖包.log4j的性能比jdk自带的日志库性能好多了. 2.添加了BufferAllocator接口,用于分配ByteBufferWrapper,ByteBufferWrapper顾名思义就是ByteBu

Visual Studio Code 的 PowerShell 扩展发布 1.0 版本

PowerShell 团队在其博客上宣布 Visual Studio Code 的 PowerShell 扩展已发布 1.0 版本.官方表示已面向 PowerShell Core 6.0 Beta.1 版本推送了更新,并希望为所有支持的平台提供官方的 PowerShell 开发体验: Windows 7 至 10 可使用 PowerShell v3 或更高版本 Linux 可使用 PowerShell v6 (所有支持 PowerShell 的发行版) macOS 和 OS X 可使用 Powe

ThinkPHP 5.0.1版本发布,小版本大更新

喜迎国庆,ThinkPHP5.0.1版本发布,提前祝TPer国庆佳节快乐,事业顺利,用ThinkPHP开发更健康^_^ ThinkPHP V5.0--为API开发而设计的高性能框架hinkPHP5.0版本是一个颠覆和重构版本,官方团队历时十月,倾注了大量的时间和精力,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化,包括路由.日志.异常.模型.数据库.模板引擎和验证等模块都已经重构,不适合原有3.2项

微软发布TypeScript 2.0 RC版本

微软释放了TypeScript 2.0的发布候选版本,包含了tagged union功能以及对globs的支持. 在微软博客的声明中,TypeScript的项目主管Daniel Rosenwasser这样说到: "这个RC版本能够帮助我们了解完整的2.0版本会是什么样子,我们正在寻求广泛的反馈,使其更加稳定,从而让2.0成为一个可靠的发布版本.整体而言,对于通常的使用来说,这个RC版本足够稳定,从这个时间点开始,我们不会再添加重要的新特性了." 其实,从2.0 beta版本发布到现在,