Java中ModelMapper的高级使用方法有哪些
本篇内容介绍了“Java中ModelMapper的高级使用方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
ModelMapper 高级使用  ModelMapper 是一个 Object To Object 的工具,类似于 MapStruct又不同于 MapStruct。主要原因是 ModelMapper 是利用反射的原理实现的 Object To Object。
使用实例本实例实现了条件映射、嵌套映射(对象中有对象映射)、自定义属性映射、List 集合映射(对象中有集合映射)、Map集合映射(对象中有集合映射)、忽略映射,默认值设置(ModelMapper 的默认值设置时一不小心就会入坑,如果直接设置默认值,当再赋值转换时,默认值会覆盖赋值的值,所以设置默认值需要结合条件映射)等。
验证了对象属性为集合,集合中还有集合能够使用 ModelMapper 进行转换。不足点是这个实例中没有验证有继承关系时的映射(使用 modelMapper.includeBase(父类1, 父类2) 方法),多个属性映射为一个属性或一个属性映射为多个属性(使用 PropertyMap 转换器)。
使用条件映射设置默认值。当 age/createTime 没有值时设置默认值为18/当前时间,有值时不设置默认值;
嵌套映射,自定义属性映射。Source 的 sourceSon 成员变量 映射到 Destination 的 destinationSon 成员变量;
List集合映射。Source 的 listSon 成员变量 映射到 Destination 的 sonList 成员变量;
Map集合映射。Source 的 mapSon 成员变量 映射到 Destination 的 sonMap 成员变量;
忽略映射。忽略 Destination 的 excessParam 成员变量,如果不忽略将验证不过,报 org.modelmapper.MappingException: ModelMapper mapping errors;
实体类(1)BaseClass
@Getter@SetterpublicclassBaseClass{privateStringid;privateStringname;publicBaseClass(){}publicBaseClass(Stringid,Stringname){this.id=id;this.name=name;}}
(2)SouSubClass
@Getter@SetterpublicclassSouSubClass{privateStringsonId;privateStringsonName;privateList<BaseClass>grandSons;publicSouSubClass(){}publicSouSubClass(StringsonId,StringsonName){this.sonId=sonId;this.sonName=sonName;}}
(3)DestSubClass
@Getter@SetterpublicclassDestSubClass{privateStringdsonId;privateStringsonName;privateStringexcessParam;privateList<BaseClass>grandSons;publicDestSubClass(){}publicDestSubClass(StringdsonId,StringsonName){this.dsonId=dsonId;this.sonName=sonName;}}
(4)Source
@Getter@SetterpublicclassSource{privateStringid;privateStringname;privateIntegerage;privateSouSubClasssourceSon;privateList<SouSubClass>listSon;privateMap<Integer,SouSubClass>mapSon;privateDatecreateTime;publicSource(){}publicSource(Stringid,Stringname){this.id=id;this.name=name;}publicSource(Stringid,Stringname,Integerage){this.id=id;this.name=name;this.age=age;}}
(5)Destination
@Getter@SetterpublicclassDestination{privateLongid;privateStringname;privateIntegerage;privateDestSubClassdestinationSon;privateList<DestSubClass>sonList;privateMap<Integer,DestSubClass>sonMap;privateStringexcessParam;privateDatecreateTime;publicDestination(){}publicDestination(Longid,Stringname){this.id=id;this.name=name;}}ModelMapper 配置类
/***描述:ModelMapper配置*/@ConfigurationpublicclassModelMapperConfig{@Bean@Scope("singleton")publicModelMappergetModelMapper(){ModelMappermodelMapper=newModelMapper();//默认为standard模式,设置为strict模式modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);//类型映射代码sourceSonToDestinationSon(modelMapper);sourceToDestination(modelMapper);//验证映射modelMapper.validate();//配置代码returnmodelMapper;}/***描述:声明Source类转Destination类的Mapper*@parammodelMapper*@Date2019/05/09*/privatevoidsourceSonToDestinationSon(ModelMappermodelMapper){modelMapper.createTypeMap(SouSubClass.class,DestSubClass.class).addMapping(SouSubClass::getSonId,DestSubClass::setDsonId).addMapping(SouSubClass::getSonName,DestSubClass::setSonName).addMappings(mapper->mapper.skip(DestSubClass::setExcessParam));}privatevoidsourceToDestination(ModelMappermodelMapper){modelMapper.createTypeMap(Source.class,Destination.class).addMappings(mapper->mapper.using((Converter<Integer,Integer>)context->{if(context.getSource()==null){return18;}returncontext.getSource();}).map(Source::getAge,Destination::setAge)).addMappings(mapper->mapper.using((Converter<Date,Date>)context->{if(context.getSource()==null){returnnewDate();}returncontext.getSource();}).map(Source::getCreateTime,Destination::setCreateTime)).addMapping(Source::getSourceSon,Destination::setDestinationSon).addMapping(Source::getListSon,Destination::setSonList).addMapping(Source::getMapSon,Destination::setSonMap).addMappings(mapper->mapper.skip(Destination::setExcessParam));}}ModelMapper Service 类
publicinterfaceTestService{DestinationtestSourceToDestination(Sourcesource);List<Destination>testSourceToDestinationList(List<Source>sources);}
@ServicepublicclassTestServiceImplimplementsTestService{@AutowiredprivateModelMappermodelMapper;@OverridepublicDestinationtestSourceToDestination(Sourcesource){Destinationdestination=modelMapper.map(source,Destination.class);returndestination;//a处}@OverridepublicList<Destination>testSourceToDestinationList(List<Source>sources){Typetype=newTypeToken<List<Destination>>(){}.getType();List<Destination>destinations=modelMapper.map(sources,type);returndestinations;//b处}}测试类
@RunWith(SpringRunner.class)@SpringBootTest(classes=TestApplication.class)publicclassTestServiceImplTest{@AutowiredprivateTestServicetestService;privatestaticSourcesource1=newSource("a","发生的",24);privatestaticSourcesource2=newSource("b","发生的");privatestaticList<Source>sources=newArrayList<>();static{List<BaseClass>baseClasses1=newArrayList<>();baseClasses1.add(newBaseClass("aa","发生的111"));baseClasses1.add(newBaseClass("bb","发生的222"));SouSubClasssubClass1=newSouSubClass("aaa","发生的3333");subClass1.setGrandSons(baseClasses1);List<BaseClass>baseClasses2=newArrayList<>();baseClasses2.add(newBaseClass("cc","国防观"));baseClasses2.add(newBaseClass("dd","国防观"));SouSubClasssubClass2=newSouSubClass("ccc","规范的大哥");subClass2.setGrandSons(baseClasses2);List<SouSubClass>sourceSonList=newArrayList<>();sourceSonList.add(subClass1);sourceSonList.add(subClass2);Map<Integer,SouSubClass>sourceSonMap=newHashMap<>();sourceSonMap.put(1,subClass1);sourceSonMap.put(2,subClass2);source1.setCreateTime(newDate(System.currentTimeMillis()-98978609));source1.setSourceSon(subClass1);source1.setListSon(sourceSonList);source1.setMapSon(sourceSonMap);source2.setSourceSon(subClass1);source2.setListSon(sourceSonList);source2.setMapSon(sourceSonMap);sources.add(source1);sources.add(source2);}@TestpublicvoidtestSourceToDestination(){testService.testSourceToDestination(source1);testService.testSourceToDestination(source2);}@TestpublicvoidtestSourceToDestinationList(){testService.testSourceToDestinationList(sources);}}测试结果
在 ab 两处打上断点,查看变量转换前后的值,证实转换成功。
“Java中ModelMapper的高级使用方法有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。