1. 概述
MapStruct 是一个库,它帮助我们在处理 Java Bean 映射时减少样板代码。它仅使用提供的接口生成映射器。
在这个教程中,我们将学习如何构建复杂的映射器,使用简单的映射器,并处理嵌套结构。
2. 数据
我们将映射 Article
类到 DTO 实例。Article
包含一些简单字段,但同时也包含类型为 Person
的 author
字段。这个字段我们也将映射到对应的 DTO。以下是源类:
@Getter
@Setter
public class Article {
private int id;
private String name;
private Person author;
}
@Getter
@Setter
public class Person {
private String id;
private String name;
}
下面是目标类:
@Getter
@Setter
public class ArticleDTO {
private int id;
private String name;
private PersonDTO author;
}
@Getter
@Setter
public class PersonDTO {
private String id;
private String name;
}
3. 定义嵌套映射器作为方法
首先,我们定义一个简单的映射器来映射我们的 Article
类:
@Mapper
public interface ArticleMapper {
ArticleMapper INSTANCE = Mappers.getMapper(ArticleMapper.class);
ArticleDTO articleToArticleDto(Article article);
}
这个映射器将正确地映射源类中的所有直连字段,但不会映射 author
字段,因为它不知道如何处理。现在,我们定义 PersonMapper
接口:
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
PersonDTO personToPersonDTO(Person person);
}
现在,我们可以做的最简单的事情是在 ArticleMapper
中创建一个方法,定义从 Person
到 PersonDTO
的映射:
default PersonDTO personToPersonDto(Person person) {
return Mappers.getMapper(PersonMapper.class).personToPersonDTO(person);
}
MapStruct 将自动识别并使用这个方法来映射 author
字段。
4. 使用已存在的映射器
虽然上述解决方案可行,但它有些繁琐。我们可以直接在 @Mapper
注解的 "uses" 参数中指定我们想要使用的映射器,而不必定义新的方法:
@Mapper(uses = PersonMapper.class)
public interface ArticleUsingPersonMapper {
ArticleUsingPersonMapper INSTANCE = Mappers.getMapper(ArticleUsingPersonMapper.class);
ArticleDTO articleToArticleDto(Article article);
}
5. 总结
在这篇文章中,我们学习了如何在另一个映射器内部使用 MapStruct 映射器。如往常一样,代码示例可以在 GitHub 上找到。