1. 概述

MapStruct 是一个库,它帮助我们在处理 Java Bean 映射时减少样板代码。它仅使用提供的接口生成映射器。

在这个教程中,我们将学习如何构建复杂的映射器,使用简单的映射器,并处理嵌套结构。

2. 数据

我们将映射 Article 类到 DTO 实例。Article 包含一些简单字段,但同时也包含类型为 Personauthor 字段。这个字段我们也将映射到对应的 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 中创建一个方法,定义从 PersonPersonDTO 的映射:

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 上找到。