当目标是内联对象时如何使用Mapstruct?

jed*_*ode 6 java mapstruct

我有这样的对象:

class User {

 private String firstName;

 private String secondName;

 private int age;

 ....
 get/set methods

}
Run Code Online (Sandbox Code Playgroud)

另一个对象将 User 作为属性:

class UserHolder {

 private User user;

 ....
 get/set methods

}
Run Code Online (Sandbox Code Playgroud)

我想将 UserHolder 转换为 User 使用MapStruct

当我编写这个映射器时,我有这样的东西:

@Mapper(componentModel = "spring")
public interface UserHolderMapper {

 @Mapping(source = "user.firstName", target = "firstName")
 @Mapping(source = "user.secondName", target = "secondName")
 @Mapping(source = "user.age", target = "age")
 User toUser(UserHolder source);

}
Run Code Online (Sandbox Code Playgroud)

但它包含很多样板代码(在@Mapping注释中),我如何对映射器说我想将source.user映射到这个目标而不指定目标的字段?

blu*_*ker 13

我参加聚会可能会迟到。但是以下应该可以正常工作。

@Mapper(componentModel = "spring")
public interface UserHolderMapper {

 @Mapping(source = "source.user", target = ".")
 User toUser(UserHolder source);

}
Run Code Online (Sandbox Code Playgroud)


Fil*_*lip 4

目前这是不可能的。已经有一个功能请求#1406,它与您需要的非常相似。

无论如何,作为解决方法,您的映射器可以如下所示:

@Mapper(componentModel = "spring")
public interface UserHolderMapper {

    default User toUser(UserHolder source) {
        return source == null ? null : toUser(source.getUser());
    }

    User toUser(UserDto source);
}
Run Code Online (Sandbox Code Playgroud)

我不知道里面的物体UserHolder是什么。UserDto只是一个假设,它可以是任何对象。

如果您不想公开,User toUser(UserDto source)那么您可以创建一个抽象映射器,并在那里使该方法受到保护和抽象。MapStruct 将能够处理它