zoukankan      html  css  js  c++  java
  • 3.3. Mapping methods with several source parameters(具有多个源参数的映射方法)

    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类型,被更新的这个属性将被清空,然后把入参源参数中的集合属性填充到已清空的目标属性上。

  • 相关阅读:
    HTML常用标记(完整版)
    理论精讲-教育知识与能力7-第四章 中学生学习心理
    前端面试题总结
    for-in 和for-of循环的区别
    Nginx部署多个vue前端项目
    vue项目PC端如何适配不同分辨率屏幕
    基于Vue的项目打包为移动端app
    js中Date对象
    React Router的Route的使用
    js中数组的sort() 方法
  • 原文地址:https://www.cnblogs.com/wzk1992/p/9197819.html
Copyright © 2011-2022 走看看