3.3. Mapping methods with several source parameters(具有多个源参数的映射方法)

MapStruct 还支持具有多个源参数的映射方法.这是比较实用的, 例如: 为了将多个实体合并为一个数据传输对象。下面显示了一个示例:

Example 10. Mapping method with several source parameters

@Mapper
public interface AddressMapper { @Mappings({
@Mapping(source = "person.description", target = "description"),
@Mapping(source = "address.houseNo", target = "houseNumber")
})
DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address);
}

显示的映射方法采用两个源参数, 并返回一个组合的目标对象。与单参数映射方法一样, 属性按名称进行映射。

如果多个源对象定义了同名的属性,必须使用 @Mapping 批注指定要从中检索属性的源参数,如示例中的描述属性所示。如果不解决此类歧义, 代码将报Error。对于仅在给定源对象中存在一次的属性, 可选择指定源参数的名称, 因为它可以自动确定。

注意:在使用 @Mapping 注解时, 确定属性具体在哪一个参数是必需的。

如果所有源参数都为 null, 则具有多个源参数的映射方法将返回 null。否则, 将会实例化目标对象, 并传播提供的参数中的所有属性。

MapStruct 还提供了直接引用源参数的可能性。

Example 11. Mapping method directly referring to a source parameter

@Mapper
public interface AddressMapper { @Mappings({
@Mapping(source = "person.description", target = "description"),
@Mapping(source = "hn", target = "houseNumber")
})
DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Integer hn);
}

上面这种情况下,就是源参数直接映射到目标对象。参数:hn, 即非 bean 类型 (在本例中为 java.lang.Integer) 映射到 DeliveryAddressDto的houseNumber。

3.4. Updating existing bean instances(更新现有 bean 实例)

在某些情况下, 您的映射不需要创建目标类型的新实例, 而是更新该类型的现有实例。通过为目标对象添加参数并使用 @MappingTarget 标记此参数, 可以实现此类映射。如下例:

Example 12. Update method

@Mapper
public interface CarMapper { void updateCarFromDto(CarDto carDto, @MappingTarget Car car);
}

编译生成后的方法updateCarFromDto() ,将使用入参carDto的属性值,有目的地更新目标对象car。除了void,您还可以将方法的返回类型设置为目标参数的类型,这样生成的实现类,将会更新并返回入参中的目标对象。这种做法可以使映射方法进行流畅的调用。

如果被更新目标对象的属性是个集合或者Map类型,被更新的这个属性将被清空,然后把入参源参数中的集合属性填充到已清空的目标属性上。

3.3. Mapping methods with several source parameters(具有多个源参数的映射方法)的更多相关文章

  1. Source Insight 基本使用(1)-使用Source Insight查看Android Framework 源码

    一.下载framework源码: google已经把framework源码托管在了gitHub上: https://github.com/android/platform_frameworks_bas ...

  2. Source insight 中 标题栏路径显示完整路径的方法

    在source insight 的标题栏中显示完整路径名的方法.Options -> Preferences -> Display -> Trim long path names w ...

  3. 为MySQL的source命令导入SQL文件配置参数

    为MySQL的source命令导入SQL文件配置参数 执行 mysql -uroot -p 输入密码后进入 MySQL 命令提示符 set charset utf8; source /root/xxx ...

  4. Flume组件source,channel,sink源码分析

    LifeCycleState: IDLE, START, STOP, ERROR [Source]: org.apache.flume.Source 继承LifeCycleAware{stop() + ...

  5. ubuntu14.04中 gedit 凝视能显示中文,而source insight中显示为乱码的解决的方法

    1.乱码显示情况: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcjc3NjgzOTYy/font/5a6L5L2T/fontsize/400/fill/ ...

  6. [效率]Source insight标题栏中路径显示完整路径的方法

    使用Source insight的时候,默认是不显示文件的全路径的,这一点有那么一段时间让我很纠结,因为很多函数都是基于硬件架构的,一个函数有很多时间.查看文件的全路径是非常有必要,可以通过以下实现: ...

  7. 错误:Parameter '0' not found.Available parameters are [arg1, arg0, param1, param2]的解决方法

    调用的方法: List<Card> temp = cardService.queryRepeat(Type,shop); xml: <select id="queryRep ...

  8. 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法

    错误重现 我的机器上安装了 maven 3.5.0,在 eclipse 中创建 maven 项目.pom.xml配置如下: <project xmlns="http://maven.a ...

  9. source tree每次push都需要密码的解决方法

    Windows首先可以考虑使用GitHub for Windows,它已经包含了该助手,或者可以下载对应系统的版本:Windows 7.Windows 8.Source 版本,然后解压缩文件并将里面的 ...

随机推荐

  1. leetcode209 Minimum Size Subarray Sum

    """ Given an array of n positive integers and a positive integer s, find the minimal ...

  2. 以及Hibernate和Mybatis区别

    ORM框架? Object Relational Mapping,对象-关系映射. 项目中的业务实体有两种表现形式:对象和关系数据,即在内存中表现为对象,在数据库中表现为关系数据. 为什么需要ORM框 ...

  3. Flutter 使用json_model解析json生成dart文件

    一.json_serializable使用步骤 1.集成json_serializable pubspec.yaml 添加以下依赖 dependencies: json_annotation: ^2. ...

  4. CMake查找第三方库路径

    问题 一直都有一个问题,就是基于Windows下使用CMake构建VS工程时,CMake是如何查找到第三方库所在的路径的呢? 答案 今天重新想起这个问题,就拿构建Vtk的VS工程测试了一下, 才发现是 ...

  5. vagrant的使用介绍

    ()添加镜像到本地仓库 vagrant box add bt_centos6.6_zouke centos-6.6-x86_64.box )初始化 vagrant init ()启动vm vagran ...

  6. 【高软作业4】:Tomcat 观察者模式解析 之 Lifecycle

    一. 预备 如果你是Windows用户,使用Eclipse,并且想自行导入源码进行分析,你可能需要:Eclipse 导入 Tomcat 源码 如果你已遗忘 观察者模式,那么你可以通过该文章回顾:设计模 ...

  7. 067、Java面向对象之不实例化对象报错

    01.代码如下: package TIANPAN; class Book { // 定义一个新的类 String title; // 书的名字 double price; // 书的价格 public ...

  8. WordPress获取首页网站链接和站点名称

    利用bloginfo 获取WordPress网站名称和主页链接 用法一: $blog_title = get_bloginfo('name'); //获取站点名称 $linkzmki = get_bl ...

  9. 什么叫github

    git remote add origin https://github.com/huiwangui/git-demo.git:表示在本地仓库关联远程仓库(https://github.com/hui ...

  10. JavaScript 文件延迟和异步加载

    JavaScript 文件延迟和异步加载 -般情况下,在文档的 <head> 标签中包含 JavaScript 脚本,或者导入的 JavaScript 文件. 这意味着必须等到全部 Jav ...