使用 MapStruct 将多个字段映射到一个字段
Map multiple fields to one with 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;
}
我有以下映射器
@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 文档中找不到任何内容。
MapSruct 不支持将多个源属性映射到单个目标 属性。
您有 2 种方法可以实现:
使用映射#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());
}
}
我有这 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 文档中找不到任何内容。
MapSruct 不支持将多个源属性映射到单个目标 属性。
您有 2 种方法可以实现:
使用映射#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());
}
}