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. 【快学springboot】6.WebMvcConfigurer配置静态资源和解决跨域

    勘误 有个朋友说:为什么我配置了WebMvcConfigurer,静态资源static依然能访问?! 这里是本人的失误,我在启动类中添加了EnableWebMvc注解(文章里却没有提及,最好的做法是放 ...

  2. 获取进程对应的UID登陆用户

    getlogin获取登陆用户,守护进程调用出错 一个用户UID可以对应多个登陆名吗?貌似可以

  3. Leet Code 8.字符串转换整数

    实现一个atoi函数,使其能将字符串转成整数,根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止.当我们寻找到的第一个非空字符为正或负号时,则将该符号与后面尽可能多的连续数字组合起来,作 ...

  4. 2_02_MSSQL课程_where查询和like模糊查询

    1.where 条件过滤 常见的表达式过滤:比如: select * from 表 where Id>10; 多条件过滤: and or not    (优先级:not > and > ...

  5. Vue.js 内联样式绑定style

    html <div class="Menu" v-bind:style="{height:clientHeight}"> </div> ...

  6. 百度统计数据导出demo的坑

    1.用户名中文的问题 由于demo文件格式的问题,如果用户名使用中文的话,会出现一下问题 ----------------------preLogin----------------------  [ ...

  7. Link Analysis_1_Basic Elements

    1. Edge Attributes 1.1 Methods of category 1.1.1 Basic three categories in terms of number of layers ...

  8. 最短路径问题:Dijkstra算法

    定义 所谓最短路径问题是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小. 下面我们介绍两种比较常用的求最短路 ...

  9. django的save方法被调用时数据是如何被保存的

    发送一个django.db.models.signals.pre_save信号,以允许监听该信号的函数完成一些自定义操作. 预处理数据.如果需要,对对象的每个字断进行自动转换. 准备数据库数据.要求咩 ...

  10. spring事物(一),@EnableTransactionManagement @Transactional 启动解析

    1.事物的声明阶段 @EnableTransactionManagement,是我们开启注解事物的第一步,我们来看下这个类为我们干了什么 @Target(ElementType.TYPE) @Rete ...