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

BeanMapping新的功能点(6月22号)

阅读更多

What is BeanMapping ?

可以提前看一下原先的帖子 我也造了个轮子:BeanMapping(属性拷贝)

 

新增功能(亮点): 

1.  Convertor转化处理

  • 支持(int,long,short,byte,char,boolean,float,double)8种原型和其对应的基本类型 + (BigInteger , BigDecimal)  + String 允许互相之间转化
  • 支持(java.util.Date , java.util.Calendar)和字符串的转化,提供默认的day("yyyy-MM-dd") , time("yyyy-MM-dd HH:mm:ss")两种格式的转化
  • 支持8种类型的Array +  List + Set,允许互相之间的转化

 

个人对Array<->Collection的转化比较满意,看一段测试代码片段就知道其强悍之处。

 

// 来一个变态的,嵌套多维数组
        List<Map> firstList = Arrays.asList(first);
        List<List<Map>> twoList = Arrays.asList(firstList);
        List<List<List<Map>>> threeList = Arrays.asList(twoList);
        List<List<List<List<Map>>>> fourList = Arrays.asList(threeList);
        Convertor arrayConvertor = helper.getConvertor(List.class, ConvertorModel[][][][].class);
        Convertor setConvertor = helper.getConvertor(List.class, Set.class);
        ConvertorModel[][][][] oldValue = (ConvertorModel[][][][]) arrayConvertor.convert(fourList,
                                                                                          ConvertorModel[][][][].class);

        ConvertorModel[][][][] newValue = (ConvertorModel[][][][]) arrayConvertor.convertCollection(
                                                                                                    fourList,
                                                                                                    ConvertorModel[][][][].class,
                                                                                                    new Class[] {
                                                                                                            ConvertorModel[][][].class,
                                                                                                            ConvertorModel[][].class,
                                                                                                            ConvertorModel[].class,
                                                                                                            ConvertorModel.class });
        Set<Set<Set<Set<ConvertorOtherModel>>>> newSetValue = (Set) setConvertor.convertCollection(
                                                                                                   fourList,
                                                                                                   Set.class,
                                                                                                   new Class[] {
                                                                                                           Set.class,
                                                                                                           Set.class,
                                                                                                           Set.class,
                                                                                                           ConvertorOtherModel.class });
        assertEquals(oldValue.length, 1);
        assertEquals(oldValue[0][0][0][0].getI(), first.get("i"));
        assertEquals(oldValue[0][0][0][0].getInteger(), first.get("integer"));
        assertEquals(oldValue[0][0][0][0].getBigDecimal(), first.get("bigDecimal"));
        assertEquals(newValue.length, 1);
        assertEquals(newValue[0][0][0][0].getI(), first.get("i"));
        assertEquals(newValue[0][0][0][0].getInteger(), first.get("integer"));
        assertEquals(newValue[0][0][0][0].getBigDecimal(), first.get("bigDecimal"));
        assertEquals(newSetValue.size(), 1);
        ConvertorOtherModel model = newSetValue.iterator().next().iterator().next().iterator().next().iterator().next();
        assertEquals(model.getI(), first.get("i"));
        assertEquals(model.getInteger(), first.get("integer"));
        assertEquals(model.getBigDecimal(), first.get("bigDecimal"));
 说明: 该段测试代码主要是对List<List<List<List<Map>>>> fourList的一个嵌套对象,转成ConvertorModel[][][][] , Set<Set<Set<Set<ConvertorOtherModel>>>>的结构,支持任意深度的嵌套

2. 配置文件变更

新增了一些配置定义,更加方便客户端更加灵活的使用。

 

  • global-configurations
    <global-configurations debug="false" mappingNullValue="true" mappingEmptyStrings="true" trimStrings="true" />
  • class-alias-configurations
    <class-alias-configurations>
        	<classAlias alias="commonClass" class="com.agapple.mapping.process.convetor.CommonAndCommonConvertor$CommonToCommon" />
    </class-alias-configurations>
  • convetors-configurations
    <convetors-configurations>
        	<convertor alias="common" class="commonClass" />
    </convetors-configurations>
     
说明下: 

* global-configurations: 允许定义一些行为控制,比如针对null value , emtpy string是否需要mapping到目标对象上。 issue : http://code.google.com/p/mapping4java/issues/detail?id=8
* class-alias-configurations : 允许定义class alias的别名,借鉴于ibatis的功能。 默认支持的alias (8种原生类型,string, map, list, set)等,这里也允许客户自己定义
* convetors-configurations : 允许定义convertor配置,避免每次都需要手工向repository进行注册。 issue :  http://code.google.com/p/mapping4java/issues/detail?id=1

3.  继承对象mapping功能

针对Object存在继承情况,类似于:http://dozer.sourceforge.net/documentation/baseattributes.html

新的配置:
BeanMappingBuilder builder = new BeanMappingBuilder() {

            protected void configure() {
                behavior().debug(true);// 设置行为
                mapping(TwoObject.class, HashMap.class);
                fields(srcField("name").locatorClass(FirstObject.class), targetField("name"));// name从父类中获取
                fields(srcField("firstValue").locatorClass(FirstObject.class), targetField("firstValue"));// 也从父类中获取
                fields(srcField("twoValue"), targetField("twoValue"));
            }

        };
可以指定locatorClass,默认为当前mapping class。允许指定其子类做为field查找的class。 对应issue : http://code.google.com/p/mapping4java/issues/detail?id=10
目前暂不支持子父属性同名方法,因为按照java动态性的原则,针对父类的Method,当前实例为子类时,会自动调用当前子类的方法。 
ps : 针对同名的处理,会该issue中同步解决 : http://code.google.com/p/mapping4java/issues/detail?id=6

 

 

 

 

4.  Mapping Config API

mapping规则定义,允许使用java api进行定义, 对应issue : http://code.google.com/p/mapping4java/issues/detail?id=5

 

mapping API使用例子:

BeanMappingBuilder builder = new BeanMappingBuilder() {

            protected void configure() {
                mapping(HashMap.class, HashMap.class).batch(false).reversable(true).keys("src", "target");
                fields(srcField("one"), targetField("oneOther")).convertor("convertor").defaultValue("ljh");
                fields(srcField("two").clazz(String.class), targetField("twoOther")).script("1+2").convertor(
                                                                                                             StringToCommon.class);
                fields(srcField("three").clazz(ArrayList.class), targetField("threeOther").clazz(HashSet.class)).recursiveMapping(
                                                                                                                                  true);
            }

        };

//根据Builder构造mapping对象
BeanMapping mapping = new BeanMapping(builder);

 

对应的代码类:


其他

目前单元测试总体覆盖率已经达到78.9%以上,来一张截图看一下。


后续Action 

1.  完善Script的功能,完善script部分的功能单元测试

2.  文档整理。 现在BeanMapping功能基本和dozer有点接近,也有自定的一些优势和功能亮点

3.  完成User Guide,准备出1.0稳定版本,可以供大家使用。

  • 大小: 99 KB
分享到:
评论
2 楼 agapple 2011-06-24  
lqixv 写道
文章写得不错啊,为什么在论坛上看不到?


我没发到论坛上,只是自己记录一下。 等文档整理的差不多了,一起发到论坛上
哈哈,论坛帖子只求质量,不求数量。 
1 楼 lqixv 2011-06-24  
文章写得不错啊,为什么在论坛上看不到?

相关推荐

    bean-mapping

    主要功能 语法支持:默认支持JDK8,lambda表达式,仅限使用JDK8+版本 对象对类自动映射:默认支持 source -&gt; class类的自动映射 对象对类手动映射:适配自动映射,支持不一致字段名称,不一致类型字手动映射。 集合对...

    xmmskj#bean-mapping#属性复制框架-03-BeanMapping 赋值条件1

    测试代码案例* 测试 source 中没有值就不会去设置的情况//1. 当 source 中没有值时//2. 当 source 中设置值时* 测试 target

    node-v5.11.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于BP用matlab实现车牌识别.zip

    基于MATLAB的系统

    Java毕业设计-基于SSM框架的学生宿舍管理系统(源码+演示视频+说明).rar

    Java毕业设计-基于SSM框架的学生宿舍管理系统(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:445】 https://pan.quark.cn/s/b3a97032fae7

    HTML+CSS+JS小项目集合.zip

    html Tab切换 检测浏览器 事件处理 拖拽 Cookie JavaScript模板 canvas canvas画图 canvas路径 WebGL示例 HTML5+CSS3 照片墙 幽灵按钮 综合实例 100du享乐网 高仿小米首页

    node-v6.17.1-linux-ppc64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    gRPC C++快速序列号跨平台库

    gRPC是轻量型且高性能的。 其处理速度可以比JSON序列化快 8 倍,消息小60%到 80%。 在Microsoft Windows Communication Foundation (WCF) 中,gRPC的性能超过经过高度优化的NetTCP绑定的速度和效率。 与偏向于Microsoft堆栈的NetTCP不同,gRPC是跨平台的。

    基于SSM+Vue的电子书籍敏感字识别系统毕业设计(源码+录像+说明).rar

    基于SSM+Vue的电子书籍敏感字识别系统毕业设计(源码+录像+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:447】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 管理员管理字典管理、公告信息管理、敏感词管理、书籍管理、用户管理、章节管理、作者管理、管理员管理等功能。【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:447】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 管理员管理字典管理、公告信息管理、敏感词管理、书籍管理、用户管理、章节管理、作者管理、管理员管理等功能。

    node-v6.10.3-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于深度学习的USPS手写体识别模型.zip

    基于深度学习的USPS手写体识别模型.zip

    Java毕业设计-基于SSM框架的小码创客教育教学资源库(源码+演示视频+说明).rar

    Java毕业设计-基于SSM框架的小码创客教育教学资源库(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:468】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 本基于SSM的小码创客教育教学资源库的设计与实现有管理员,校长,教师,学员四个角色。管理员可以管理校长,教师,学员等基本信息,校长角色除了校长管理之外,其他管理员可以操作的校长角色都可以操作。教师可以发布论坛,课件,视频,作业,学员可以查看和下载所有发布的信息,还可以上传作业。

    大二上python课设,一个基于max-min算法以及深度强化学习的井字棋游戏.zip

    大二上python课设,一个基于max-min算法以及深度强化学习(参考谷歌论文mastering the game of go without human knowledge)的井字棋游戏.zip

    node-v6.14.4-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.9.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.7.2-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    C# QuadTree For CAD

    cad环境下的四叉树代码,提高图形查速度

    node-v0.12.5-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    12 催货通知单-EPES19-SC-CG-027-2023.xlsx

    12 催货通知单-EPES19-SC-CG-027-2023.xlsx

Global site tag (gtag.js) - Google Analytics