- 浏览: 1596169 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
jsrgzhangzhiyong:
关于null值的转换还是感觉不太友好,就像 mapstruct ...
我也造了个轮子:BeanMapping(属性拷贝) -
he037:
a417930422 写道引用使用EPHEMERAL会引出一个 ...
基于zookeeper的分布式lock实现 -
seancheer:
qianshangding 写道首先节点启动后,尝试读取本地的 ...
zookeeper学习记录三(session,watcher,persit机制) -
雪夜归人:
您好,我想咨询一下,开源的canal都能支持mysql的哪些版 ...
Canal BinlogChange(mysql5.6) -
zhoudengyun:
copy 一份做记录,后续学习,请知悉
阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费
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,允许互相之间的转化
对应的issue : http://code.google.com/p/mapping4java/issues/detail?id=4 , http://code.google.com/p/mapping4java/issues/detail?id=9
个人对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稳定版本,可以供大家使用。
评论
2 楼
agapple
2011-06-24
lqixv 写道
文章写得不错啊,为什么在论坛上看不到?
我没发到论坛上,只是自己记录一下。 等文档整理的差不多了,一起发到论坛上
哈哈,论坛帖子只求质量,不求数量。
1 楼
lqixv
2011-06-24
文章写得不错啊,为什么在论坛上看不到?
发表评论
-
yugong QuickStart
2016-03-05 01:52 0几点说明 a. 数据迁移的方案可参见设计文档,oracl ... -
阿里巴巴开源项目: 阿里巴巴去Oracle数据迁移同步工具
2016-03-05 18:29 6517背景 08年左右,阿里巴巴开始尝试MySQL的相关 ... -
愚公performance
2016-03-02 17:29 0性能测试 全量测试 场景1 (单主键, ... -
yugong AdminGuide
2016-03-02 16:40 0环境要求 操作系统 数据库 迁移方案 部署 ... -
Tddl_hint
2014-01-27 13:52 0背景 工作原理 Hint格式 direct模 ... -
tddl5分库规则
2014-01-26 14:41 0背景 工作原理 构建语法树 元数据 基于 ... -
tddl5优化器
2014-01-22 15:12 0背景 工作原理 构建语法树 元数据 抽象语 ... -
Canal BinlogChange(mariadb5/10)
2014-01-20 17:25 4596背景 先前开源了一个 ... -
asynload quickstart
2013-10-08 22:49 0几点说明: 1. asyncload是做为一个j ... -
映射规则配置
2013-09-26 11:25 0背景 因为alibaba的特殊业务,比如: 同 ... -
网友文档贡献
2013-09-18 15:50 01. Otter源代码解析系列 链接:http://e ... -
Manager配置介绍
2013-09-16 13:00 0通道配置说明 多种同步方式配置 a. 单向同步 ... -
canal&otter FAQ
2013-09-05 17:30 0常见问题 1. canal和 ... -
阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
2013-08-22 16:48 40441项目背景 阿里巴巴B2B公司,因为业务的特性 ... -
Otter AdminGuide
2013-08-19 11:06 0几点说明 otter系统自带了manager,所以简化了一 ... -
Otter高可用性
2013-08-17 23:41 0基本需求 网络不可靠,异地机房尤为明显. man ... -
Otter数据一致性
2013-08-17 23:39 0技术选型分析 需要处理一致性的业务场景: 多地修改 ( ... -
Otter扩展性
2013-08-17 22:20 0扩展性定义 按照实现不同,可分为两类: 数据处理自定 ... -
Otter双向回环控制
2013-08-17 21:37 0基本需求 支持mysql/oracle的异构数据库的双 ... -
Otter调度模型
2013-08-17 20:13 0背景 在介绍调度模型之前,首先了解一下otter系统要解 ...
相关推荐
主要功能 语法支持:默认支持JDK8,lambda表达式,仅限使用JDK8+版本 对象对类自动映射:默认支持 source -> class类的自动映射 对象对类手动映射:适配自动映射,支持不一致字段名称,不一致类型字手动映射。 集合对...
测试代码案例* 测试 source 中没有值就不会去设置的情况//1. 当 source 中没有值时//2. 当 source 中设置值时* 测试 target
6. **测试和调试**: Spring的测试框架,如`@SpringBootTest`和`MockMvc`,可以帮助我们在不依赖外部环境的情况下对整合后的系统进行单元测试和集成测试。 通过以上步骤,我们可以将Axis2 Web服务完全融入Spring的...
接着,我们编写一个名为`GetStudentService`的服务程序,它包含一个`getAStudent`方法,该方法接收一个字符串参数并返回一个新的`Student`对象。这个服务程序是Web服务的实际实现。 部署服务时,我们需要把Axis的`...
http://dozer.sourceforge.net/schema/beanmapping.xsd"> <stop-on-errors>true <date-format>yyyy-MM-dd HH:mm:ss <wildcard>true <trim-strings>true <!-- <class-a>...