【问题标题】:Map multiple fields to one with MapStruct使用 MapStruct 将多个字段映射为一个
【发布时间】:2019-03-14 06:58:04
【问题描述】:

我将这 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和works,我想用

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

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

【问题讨论】:

    标签: mapstruct


    【解决方案1】:

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

    您有两种方法可以实现这一目标:

    使用映射#表达式

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

    【讨论】:

    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多