使用MapStruct将多个字段映射到一个

Sty*_*tyl 5 mapstruct

我在单独的文件中有这3个类

public class Book {

   @Id
    @GeneratedValue
    private Long id;

    @NonNull
    private String title;

    @NonNull
    private Author author;

}

public class Author {

    @Id
    @GeneratedValue
    private Long id;

    @NonNull
    private String firstName;

    @NonNull
    private String lastName;

}

public class BookDTO {

    private Long id;

    @NonNull
    private String title;

    @NonNull
    private String author;

}
Run Code Online (Sandbox Code Playgroud)

我有以下映射器

@Mapper
public interface BookMapper { 

    BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);

    @Mappings({
            @Mapping(source = "author.lastName", target = "author")
    })
    BookDTO toDTO(Book book);

}
Run Code Online (Sandbox Code Playgroud)

这当前只映射lastName并且工作,我想在Book with中映射作者字符串

author.firstName + " " + author.lastName
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?我无法在MapStruct文档中找到任何内容.

Fil*_*lip 9

MapSruct不支持将多个源属性映射到单个目标属性.

您有两种方法可以实现此目的:

使用Mapping#表达式

@Mapping( target = "author", expression = "java(book.getAuthor().getFirstName() + \" \" + book.getAuthor().getLastName())")
Run Code Online (Sandbox Code Playgroud)

使用@AfterMapping@BeforeMapping

@Mapper
public interface BookMapper { 

    BookMapper INSTANCE = Mappers.getMapper(BookMapper.class);


    @Mapping(target = "author", ignore = true)
    BookDTO toDTO(Book book);

    @AfterMapping
    default void setBookAuthor(@MappingTarget BookDTO bookDTO, Book book) {
        Author author = book.getAuthor();
        bookDTO.setAuthor(author.getFirstName() + " " + author.getLastName());
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 还有第三种方法/sf/answers/3241642911/ (2认同)

小智 9

您还可以通过使用句点引用源,将包含所需作为源字段的多个字段的映射器方法引用的对象传递给“qualifiedByName”方法。

@Mapper
public interface BookMapper { 

   @Mapping(target = "author", source = ".", qualifiedByName = "getFullName")
   BookDTO toDTO(Book book);

   @Named("getFullName")
   default String getFullName(Book book) {
       return book.getAuthor().getFirstName() + " " + book.getAuthor().getLastName();
   } 
}
Run Code Online (Sandbox Code Playgroud)