文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java中ModelMapper的高级使用方法有哪些

2023-06-29 06:32

关注

本篇内容介绍了“Java中ModelMapper的高级使用方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

ModelMapper 高级使用

  ModelMapper 是一个 Object To Object 的工具,类似于 MapStruct又不同于 MapStruct。主要原因是 ModelMapper 是利用反射的原理实现的 Object To Object。

使用实例

本实例实现了条件映射、嵌套映射(对象中有对象映射)、自定义属性映射、List 集合映射(对象中有集合映射)、Map集合映射(对象中有集合映射)、忽略映射,默认值设置(ModelMapper 的默认值设置时一不小心就会入坑,如果直接设置默认值,当再赋值转换时,默认值会覆盖赋值的值,所以设置默认值需要结合条件映射)等。
验证了对象属性为集合,集合中还有集合能够使用 ModelMapper 进行转换。不足点是这个实例中没有验证有继承关系时的映射(使用 modelMapper.includeBase(父类1, 父类2) 方法),多个属性映射为一个属性或一个属性映射为多个属性(使用 PropertyMap 转换器)。

实体类

(1)BaseClass

@Getter@Setterpublic class BaseClass {    private String id;    private String name;    public BaseClass() {    }    public BaseClass(String id, String name) {        this.id = id;        this.name = name;    }}

(2)SouSubClass

@Getter@Setterpublic class SouSubClass {    private String sonId;    private String sonName;    private List<BaseClass> grandSons;    public SouSubClass() {    }    public SouSubClass(String sonId, String sonName) {        this.sonId = sonId;        this.sonName = sonName;    }}

(3)DestSubClass

@Getter@Setterpublic class DestSubClass {    private String dsonId;    private String sonName;    private String excessParam;    private List<BaseClass> grandSons;    public DestSubClass(){    }    public DestSubClass(String dsonId, String sonName) {        this.dsonId = dsonId;        this.sonName = sonName;    }}

(4)Source

@Getter@Setterpublic class Source {    private String id;    private String name;    private Integer age;    private SouSubClass sourceSon;    private List<SouSubClass> listSon;    private Map<Integer, SouSubClass> mapSon;    private Date createTime;    public Source() {    }    public Source(String id, String name) {        this.id = id;        this.name = name;    }    public Source(String id, String name, Integer age) {        this.id = id;        this.name = name;        this.age = age;    }}

(5)Destination

@Getter@Setterpublic class Destination {    private Long id;    private String name;    private Integer age;    private DestSubClass destinationSon;    private List<DestSubClass> sonList;    private Map<Integer, DestSubClass> sonMap;    private String excessParam;    private Date createTime;    public Destination() {    }    public Destination(Long id, String name) {        this.id = id;        this.name = name;    }}

ModelMapper 配置类

@Configurationpublic class ModelMapperConfig {    @Bean    @Scope("singleton")    public ModelMapper getModelMapper() {        ModelMapper modelMapper = new ModelMapper();        //默认为standard模式,设置为strict模式        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);        // 类型映射代码        sourceSonToDestinationSon(modelMapper);        sourceToDestination(modelMapper);        //验证映射        modelMapper.validate();        // 配置代码        return modelMapper;    }        private void sourceSonToDestinationSon(ModelMapper modelMapper) {        modelMapper.createTypeMap(SouSubClass.class, DestSubClass.class)                .addMapping(SouSubClass::getSonId, DestSubClass::setDsonId)                .addMapping(SouSubClass::getSonName, DestSubClass::setSonName)                .addMappings(mapper -> mapper.skip(DestSubClass::setExcessParam));    }    private void sourceToDestination(ModelMapper modelMapper) {        modelMapper.createTypeMap(Source.class, Destination.class)                .addMappings(mapper -> mapper.using((Converter<Integer, Integer>) context -> {                        if (context.getSource() == null) {                            return 18;                        }                        return context.getSource();                    }).map(Source::getAge, Destination::setAge))                .addMappings(mapper -> mapper.using((Converter<Date, Date>) context -> {                        if (context.getSource() == null) {                            return new Date();                        }                        return context.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 类

public interface TestService {    Destination testSourceToDestination(Source source);    List<Destination> testSourceToDestinationList(List<Source> sources);}
@Servicepublic class TestServiceImpl implements TestService {    @Autowired    private ModelMapper modelMapper;    @Override    public Destination testSourceToDestination(Source source) {        Destination destination = modelMapper.map(source, Destination.class);        return destination;  // a 处    }    @Override    public List<Destination> testSourceToDestinationList(List<Source> sources) {        Type type = new TypeToken<List<Destination>>(){}.getType();        List<Destination> destinations = modelMapper.map(sources, type);        return destinations; // b 处    }}

测试类

@RunWith(SpringRunner.class)@SpringBootTest(classes = TestApplication.class)public class TestServiceImplTest {    @Autowired    private TestService testService;    private static Source source1 = new Source("a", "发生的", 24);    private static Source source2 = new Source("b", "发生的");    private static List<Source> sources = new ArrayList<>();    static {        List<BaseClass> baseClasses1 = new ArrayList<>();        baseClasses1.add(new BaseClass("aa", "发生的111"));        baseClasses1.add(new BaseClass("bb", "发生的222"));        SouSubClass subClass1 = new SouSubClass("aaa", "发生的3333");        subClass1.setGrandSons(baseClasses1);        List<BaseClass> baseClasses2 = new ArrayList<>();        baseClasses2.add(new BaseClass("cc", "国防观"));        baseClasses2.add(new BaseClass("dd", "国防观"));        SouSubClass subClass2 = new SouSubClass("ccc", "规范的大哥");        subClass2.setGrandSons(baseClasses2);        List<SouSubClass> sourceSonList = new ArrayList<>();        sourceSonList.add(subClass1);        sourceSonList.add(subClass2);        Map<Integer, SouSubClass> sourceSonMap = new HashMap<>();        sourceSonMap.put(1, subClass1);        sourceSonMap.put(2, subClass2);        source1.setCreateTime(new Date(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);    }    @Test    public void testSourceToDestination() {        testService.testSourceToDestination(source1);        testService.testSourceToDestination(source2);    }    @Test    public void testSourceToDestinationList() {        testService.testSourceToDestinationList(sources);    }}

测试结果

在 ab 两处打上断点,查看变量转换前后的值,证实转换成功。

“Java中ModelMapper的高级使用方法有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯