BeanMapping发布1.0.2版本

  1. 云栖社区>
  2. 博客>
  3. 正文

BeanMapping发布1.0.2版本

愤怒的苹果 2016-03-30 11:02:57 浏览1818
展开阅读全文

背景

  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,性能上也会有一定的惊喜。




网友评论

登录后评论
0/500
评论
愤怒的苹果
+ 关注