我在单独的文件中有这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文档中找到任何内容.
MapSruct不支持将多个源属性映射到单个目标属性.
您有两种方法可以实现此目的:
@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)
小智 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)
| 归档时间: |
|
| 查看次数: |
2435 次 |
| 最近记录: |