我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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@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

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

在 Java 中,unshift 方法的高级使用技巧有哪些?(java中unshift方法的高级用法)

在Java编程中,unshift方法是数组对象的一个重要方法,它用于在数组的开头添加一个或多个元素,并返回新数组的长度。虽然unshift方法在日常的数组操作中较为常见,但它还有一些高级用法,可以帮助我们更灵活地处理数组数据。
在 Java 中,unshift 方法的高级使用技巧有哪些?(java中unshift方法的高级用法)
Java2024-12-15

Vim高级使用方法有哪些

这篇文章主要介绍了Vim高级使用方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vim高级使用方法有哪些文章都会有所收获,下面我们一起来看看吧。你会发现,使用 Vim 非常方便的的场景几乎总是涉及到运行
2023-06-27

bash高级使用方法有哪些

小编给大家分享一下bash高级使用方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!linux的发布版本之一--Redhat/CentOS--系统默认安装的
2023-06-27

Java 中 Velocity 的使用方法具体有哪些?(java中velocity的使用方法有哪些)

在Java开发中,Velocity是一个非常实用的模板引擎,它可以用于生成动态文本、HTML页面等。下面将详细介绍Java中Velocity的使用方法。一、Velocity的简介Velocity是一个基于J
Java 中 Velocity 的使用方法具体有哪些?(java中velocity的使用方法有哪些)
Javavelocity2024-12-14

Linux中more命令高级使用方法有哪些

这篇文章给大家分享的是有关Linux中more命令高级使用方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一
2023-06-27

Linux 下nmon的高级使用方法有哪些

这篇文章主要介绍了Linux 下nmon的高级使用方法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析
2023-06-27

Java 中 switch 语句的使用方法详解有哪些?(Java中switch的使用方法有哪些)

在Java编程中,switch语句是一种用于根据不同的条件执行不同代码块的控制结构。它提供了一种简洁的方式来处理多个可能的情况,而不是使用一系列的if-else语句。以下是关于Java中switch的使用方法
Java 中 switch 语句的使用方法详解有哪些?(Java中switch的使用方法有哪些)
Javaswitch2024-12-15

java枚举高级用法有哪些

Java枚举的高级用法包括:1. 枚举的自定义方法:可以为枚举类型添加自定义方法,使其具有更多的功能。2. 枚举的构造函数和属性:可以给枚举类型添加构造函数和属性,使其具有更多的属性和行为。3. 枚举的静态方法和实例方法:可以为枚举类型添加
2023-08-21

java中velocity的使用方法有哪些

在Java中使用Velocity模板引擎有以下几种方法:1. 使用Velocity的原始API:通过创建Velocity引擎实例,加载和渲染模板文件。以下是一个简单的示例:```javaimport org.apache.velocity.
2023-09-16

java中stringbuffer的使用方法有哪些

Java中StringBuffer的使用方法有以下几种:1. 创建StringBuffer对象:- 使用空参构造方法创建一个空的StringBuffer对象:`StringBuffer sb = new StringBuffer();`-
2023-08-25

Java的使用方法有哪些

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

Java中的String类使用方法有哪些

今天小编给大家分享一下Java中的String类使用方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。StringSt
2023-07-06

Java中String类的使用方法有哪些

这篇文章主要介绍“Java中String类的使用方法有哪些”,在日常操作中,相信很多人在Java中String类的使用方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中String类的使用方法
2023-06-25

Java Socket 有哪些具体的使用方法?(java socket的用法有哪些)

在Java编程中,JavaSocket是一种用于网络编程的重要技术,它允许Java应用程序通过网络进行通信。以下是JavaSocket的一些常见用法:一、创建服务器端Socket在服务
Java Socket 有哪些具体的使用方法?(java socket的用法有哪些)
Java2024-12-22

Java中String类有哪些使用方法

这篇文章给大家分享的是有关Java中String类有哪些使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。StringString类:代表字符串,提供了开发中常用的字符串处理的方法,如:求字符串的长度、截取字
2023-06-29

Python的高级用法有哪些

本篇内容主要讲解“Python的高级用法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python的高级用法有哪些”吧!Lambda 函数Lambda 函数是一种比较小的匿名函数&mdas
2023-06-16

gojs的高级用法有哪些

本篇内容主要讲解“gojs的高级用法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“gojs的高级用法有哪些”吧!1. 取消更新动画问题:更新数据的时候,会触发渲染,有渲染动画,用户体验不好
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录