MapStruct:将2个对象映射到第3个对象

时间:2015-12-07 09:48:46

标签: java object-object-mapping mapstruct

我有Object1和Object2。现在,我想映射object3,其属性来自1& 2。

说,我有2个对象:

1. User: {first_name, last_name, id}
2. Address: {street, locality, city, state, pin, id}

现在,有了这些,我想在

中映射
User_View: {firstName, lastName, city, state}.

其中,first_name& last_name将来自User对象 和城市&来自地址对象的状态。

现在,我的问题是,怎么做?

但是,目前,我这样做

@Mapper    
public abstract class UserViewMapper {
        @Mappings({
                    @Mapping(source = "first_name", target = "firstName"),
                    @Mapping(source = "last_name", target = "lastName"),
                    @Mapping(target = "city", ignore = true),
                    @Mapping(target = "state", ignore = true)

            })
            public abstract UserView userToView(User user);

        public UserView addressToView(UserView userView, Address address) {

                if (userView == null) {
                    return null;
                }

                if (address == null) {
                    return null;
                }

                userView.setCity(address.getCity());
                userView.setState(address.getState()); 

            return userView;

            }
    }

但是,在这里,我必须在addressToView()中手动编写映射。

因此,有什么办法可以避免这种情况吗?

或者,处理此类情况的首选方法是什么?

2 个答案:

答案 0 :(得分:10)

您可以使用多个源参数声明一个映射方法,并在@Mapping注释中引用所有这些参数的属性:

@Mapper
public abstract class UserViewMapper {

    @Mapping(source = "first_name", target = "user.firstName"),
    @Mapping(source = "last_name", target = "user.lastName"),
    public abstract UserView userAndAddressToView(User user, Address address);
}

由于“city”和“state”属性名称在源和目标中匹配,因此无需映射它们。

有关详细信息,另请参阅参考文档中的"Defining a mapper"一章。

答案 1 :(得分:0)

使用MapStruct,您缺少使用@Mapper注释的步骤。 @Mapper将创建映射的实现。

您应该在此链接http://mapstruct.org/documentation/stable/reference/html/

上查看文档

具体地

  
      
  1. 定义映射器
  2.         

    在本节中,您将学习如何使用bean定义bean映射器   MapStruct以及您必须执行的选项。   3.1基本映射

         

    要创建映射器,只需使用所需的Java接口定义   映射方法并使用org.mapstruct.Mapper对其进行注释   注释:

    @Mapper
    public interface CarMapper {
    
        @Mappings({
            @Mapping(source = "make", target = "manufacturer"),
            @Mapping(source = "numberOfSeats", target = "seatCount")
        })
        CarDto carToCarDto(Car car);
    
        @Mapping(source = "name", target = "fullName")
        PersonDto personToPersonDto(Person person);
    }
    
         

    @Mapper注释导致MapStruct代码生成器创建   在构建期间实现CarMapper接口。