当前位置: 首页 > 知识库问答 >
问题:

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

李昌勋
2023-03-14

我有Object1和Object2。现在,我想映射对象3,属性来自1

比方说,我有两个目标:

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

现在,有了这些,我想把它映射进去

User_View: {firstName, lastName, city, state}.

哪里,first_name

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

然而,目前,我正在这样做

@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个答案

宗翔宇
2023-03-14

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

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

具体来说

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

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

@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接口的实现。

尉迟华翰
2023-03-14

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

@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);
}

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

有关更多详细信息,请参阅参考文档中的“定义映射器”一章。

 类似资料: