返回顶部
首页 > 资讯 > 后端开发 > Python >Java中ModelMapper 的高级使用
  • 850
分享到

Java中ModelMapper 的高级使用

2024-04-02 19:04:59 850人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录ModelMapper高级使用使用实例实体类ModelMapper配置类ModelMapperService类测试类测试结果ModelMapper 高级使用  &ems

ModelMapper 高级使用

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

  ModelMapper 官方apiHttp://modelmapper.org/user-manual/property-mapping/

使用实例

本实例实现了条件映射、嵌套映射(对象中有对象映射)、自定义属性映射、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
@Setter
public 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
@Setter
public 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
@Setter
public 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
@Setter
public 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
@Setter
public 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 配置类


@Configuration
public 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);
}
@Service
public 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 的高级使用的文章就介绍到这了,更多相关Java ModelMapper内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中ModelMapper 的高级使用

本文链接: https://lsjlt.com/news/139895.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中ModelMapper 的高级使用
    目录ModelMapper高级使用使用实例实体类ModelMapper配置类ModelMapperService类测试类测试结果ModelMapper 高级使用  &ems...
    99+
    2024-04-02
  • Java中ModelMapper的高级使用方法有哪些
    本篇内容介绍了“Java中ModelMapper的高级使用方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ModelMapper 高...
    99+
    2023-06-29
  • Java高级之HashMap中的entrySet()方法使用
    目录基本使用原理剖析总结基本使用 entrySet()方法得到HashMap中各个键值对映射关系的集合。 然后Map.Entry中包含了getKey()和getValue()方法获取...
    99+
    2023-03-22
    Java HashMap Java entrySet()方法 Java HashMap entrySet()方法
  • java中RabbitMQ高级应用
    目录1、消息可靠性投递 1.1、确认模式 1.2、退回模式 1.3、确认机制2、消费端限流3、消息过期时间4、死信队列 4.1、死信概念&nb...
    99+
    2024-04-02
  • Java高级之HashMap中的entrySet()方法怎么使用
    本篇内容主要讲解“Java高级之HashMap中的entrySet()方法怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java高级之HashMap中的entrySet()方法怎么使用”...
    99+
    2023-07-05
  • java高级用法之JNA中的Structure
    目录简介native中的structStructure特殊类型的Structure结构体数组作为参数结构体数组作为返回值结构体中的结构体结构体中的数组结构体中的可变字段结构体中的只读...
    99+
    2024-04-02
  • java高级用法之JNA中的Function
    目录简介function的定义Function的实际应用总结简介 在JNA中,为了和native的function进行映射,我们可以有两种mapping方式,第一种是interfac...
    99+
    2024-04-02
  • java高级用法之JNA中使用类型映射
    目录简介类型映射的本质TypeMapperNativeMapped总结简介 JNA中有很多种映射,library的映射,函数的映射还有函数参数和返回值的映射,libary和函数的映射...
    99+
    2024-04-02
  • java中RabbitMQ高级应用方法
    这篇文章主要介绍了java中RabbitMQ高级应用方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中RabbitMQ高级应用方法文章都会有所收获,下面我们一起来看看吧。1、消息可靠性投递&e...
    99+
    2023-06-30
  • MVC中WebGrid控件的高级使用
    WebGrid控件是ASP.NET MVC中用于显示和编辑数据的强大工具。除了基本的显示和分页功能之外,WebGrid还提供了一些高...
    99+
    2023-09-20
    MVC
  • 如何在 Django 中使用 Java IDE 的高级函数功能?
    Django 是一个流行的 Python Web 框架,而 Java IDE 是一个强大的工具,用于开发 Java 应用程序。在本文中,我们将介绍如何在 Django 中使用 Java IDE 的高级函数功能。 首先,让我们了解一下 Ja...
    99+
    2023-09-16
    ide 函数 django
  • mysql中如何使用limit的高级用法
    本文主要给大家简单讲讲mysql中如何使用limit的高级用法,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql中如何使用limit的高级用法这篇文章...
    99+
    2024-04-02
  • Laravel中where的高级使用方法
    这篇文章主要介绍了Laravel中where的高级使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。有时候项目中需要进行多个字段搜索就可以用到此方法在Larav...
    99+
    2023-06-08
  • Java 流的高级使用之收集数据解析
    目录一、前言1.1 收集器1.2 预定义收集器Collectors类为我们提供的收集器,主要包含三大功能:二、深入2.1 规约和汇总统计元素数量查找流中的最大值和最小值汇总连接字符串...
    99+
    2024-04-02
  • java高级用法之JNA中的回调问题
    目录简介JNA中的Callbackcallback的应用callback的定义callback的获取和应用在多线程环境中使用callback总结简介 什么是callback呢?简单点...
    99+
    2024-04-02
  • 详述Linux中Firewalld高级配置的使用
    IP伪装与端口转发 Firewalld支持两种类型的网络地址转换 IP地址伪装(masquerade) 可以实现局域网多个地址共享单一公网地址上网 IP地址伪装仅支持IPv4,不支持IPv6 默认ext...
    99+
    2022-06-04
    Linux Firewalld高级配置 Linux Firewalld
  • CSS中的高级使用技巧有哪些
    这篇文章主要为大家展示了“CSS中的高级使用技巧有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS中的高级使用技巧有哪些”这篇文章吧。 使用 :not...
    99+
    2024-04-02
  • CSS在使用中的高级技巧分享
    本篇内容主要讲解“CSS在使用中的高级技巧分享”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS在使用中的高级技巧分享”吧!一、ul标签在Mozilla中默认是有padding值的,而在IE中...
    99+
    2023-06-08
  • Java SpringBoot高级用法详解
    目录1,IDEA中Lombok作用创建项目2.pom.xml说明2.1 pom.xml标签说明2.2 依赖的相关说明2.3 SHA1介绍SpringBoot高级用法YML文件说明3....
    99+
    2024-04-02
  • 高级Golang包的使用技巧
    Golang包的高级应用技巧 在使用Golang开发应用程序时,包是非常重要的概念。包可以帮助我们组织代码,并提供了可重用和封装的功能。除了基本的应用场景,Golang包还有一些高级的应用技巧,可以让我们更加...
    99+
    2024-01-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作