// 来一个变态的,嵌套多维数组 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"));
新增了一些配置定义,更加方便客户端更加灵活的使用。
<global-configurations debug="false" mappingNullValue="true" mappingEmptyStrings="true" trimStrings="true" />
<class-alias-configurations> <classAlias alias="commonClass" class="com.agapple.mapping.process.convetor.CommonAndCommonConvertor$CommonToCommon" /> </class-alias-configurations>
<convetors-configurations> <convertor alias="common" class="commonClass" /> </convetors-configurations>
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")); } };
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%以上,来一张截图看一下。
1. 完善Script的功能,完善script部分的功能单元测试
2. 文档整理。 现在BeanMapping功能基本和dozer有点接近,也有自定的一些优势和功能亮点
3. 完成User Guide,准备出1.0稳定版本,可以供大家使用。