BeanMapping发布1.0.2版本
程序员文章站
2022-07-08 16:45:33
...
背景
BeanMapping是什么? 请查看我之前的一篇文章: 我也造了个*:BeanMapping(属性拷贝)
版本变更内容
- convetor包名重构,拼写错误
- ScriptExecutor接口重构,加上ScriptContext操作
- FiledSetExecutor去除对args的强制匹配依赖
- mapping支持name定义
- mapping支持嵌套映射/集合映射对象的name定义
- 增加NullSymbolGetExecutor的实现,支持无源属性的映射
相比于 BeanMapping发布1.0.1版本,主要增加的两个特性:
特性1:mapping支持别名定义
可以解决的需求:
- map<->map之间可以有不同的映射规则,服务化接口用map这样弱类型的情况会比较多.
- 嵌套映射,集合映射都可以指定特定的映射规则,改变原先的默认按照class类型查找的方式
[email protected]
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:
[email protected]
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. }
后续计划:
- 支持object factory模式,允许自己控制嵌套对象的创建过程,目前默认是系统通过构造函数进行newInstance.
- fel script实现支持 (http://www.iteye.com/news/24711-Fel-java-script)
目前在阿里公司内部正在逐步使用,也欢迎大家试用和给我提需求,可以非常方便的替换原先的BeanUtils,性能上也会有一定的惊喜。
推荐阅读
-
优麒麟18.04.4 LTS版本发布:管用3年
-
百度地图发布基于AI的新版本 利用AI算法躲避拥堵
-
Visual Studio 2016 Preview 3版本发布下载
-
OPPO Reno 5G版本意大利正式发布 助力意大利开启5G时代
-
MetInfo企业建站系统 V6.1.1 版本发布上线
-
Opera首个重生版本发布 Opera重生版本更新哪些内容?
-
极客浏览器Vivaldi 1.7正式版本发布:新功能众多
-
华为P40系列发布会上要推保时捷版本?3月揭晓
-
【转载】Visual Studio2017如何设置打包发布的WinForm应用程序的版本号
-
iOS/iPadOS 14.7 Release Candidate 候选版本正式发布