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

问题描述 投票:0回答:2

我在单独的文件中有这 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;

}

我有以下映射器

@Mapper
public interface BookMapper { 

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

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

}

这目前只映射 lastName 和作品,我想用

映射 Book 中的作者字符串
author.firstName + " " + author.lastName

我怎么能那样做?我在 MapStruct 文档中找不到任何内容。

mapstruct
2个回答
56
投票

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

您有两种方法可以实现:

使用映射#expression

@Mapping( target = "author", expression = "java(book.getAuthor().getFirstName() + \" \" + book.getAuthor().getLastName())")

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

}

0
投票

您还可以通过使用句点引用源将包含多个源字段的字段的父对象传递给“qualifiedByName”方法。

    @Mapper
    public interface BookMapper { 

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

       @Named("getFullName")
       public String getFullName(Book book) {
           return book.getAuthor().getFirstName() + " " + book.getAuthor().getLastName();
       } 
    }
© www.soinside.com 2019 - 2024. All rights reserved.