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. iOS直播集成和问题总结(阿里云直播)

    https://www.jianshu.com/p/714ce954e628 最近接手公司的直播项目,对以前遗留的问题做处理和优化, 于是顺便看了下阿里云直播的文档,在下面写下对直播的理解和遇到的问题 ...

  2. Tensorflow之AttributeError: module 'tensorflow' has no attribute 'mul'

      tf.mul已经在新版本中被移除,请使用 tf.multiply 代替

  3. XPath 和 CSS

    1.XPath XPath 即 XML 路径语言 (XML Path Language),他是一种用来确定 xml 文档中某部分位置的语言. xml文档(html 属于 xml)是由一系列节点构成的树 ...

  4. Vue--爬坑

    1.路由变化页面数据不刷新问题: 出现这种情况是因为依赖路由的params参数获取写在created生命周期里面,因为相同路由二次甚至多次加载的关系 没有达到监听,退出页面再进入另一个文章页面并不会运 ...

  5. 【Android】在程序中使用触力反馈

    触力反馈又名:hapticFeedbackEnabled 一般有两种实现方式 第一种是在XML布局文件里面设置 android:hapticFeedbackEnabled="true&quo ...

  6. Logback的AsyncAppender与RollingFileAppender流程解析

    近期工作中涉及到文件记录.文件翻转等操作,思考有没有成熟的代码以便参考. 因此,第一时间就联想到Logback的AsyncAppender以及RollingFileAppender. AsyncApp ...

  7. Java设计模式之Iterator模式

    分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...

  8. dMd----攻防世界

    首先在Linux上查看题目,没有什么发现elf文件,之后使用ida打开看看,找到main函数,f5查看, 上图一些字符是char过的,便于查看,发现是一个if else语句,先经过了MD5加密然后判断 ...

  9. 关于ESP8266和ESP8285的对比

    ESP8285=ESP8266+1M Flash. 与ESP8266相比,其能耐高温达125摄氏度!且原有ESP8266源码程序可以原封不动移植使用.ESP-M1/M2 模块核心处理器采用高性价比芯片 ...

  10. 什么是IPFS?IPFS与区块链有什么关系

    1.什么是IPFS? IPFS是Inter Planetary File System(星际文件系统)的缩写,是一个典型的点对点分布式文件系统, 旨在用同一个文件系统连接所有的计算设备.这时候有些小伙 ...