有关 MapStruct 映射的多个问题

Sub*_*aha 4 java spring object-object-mapping mapstruct

我是使用 MapStruct 的新手,因此面临一些相同的问题。

我有以下模型类:-

@Data
class User {

@Field
private String fullName;

@Field("experience")
private List<Experience> workExperience;

//other fields

}

@Data
class Experience {

private Date joiningDate;

//other fields
}

Run Code Online (Sandbox Code Playgroud)

现在,我有以下 DTO

@Data
class UserDTO {

 private String firstName;

 private String lastName;

 private List<ExperienceDTO> workExperience;

 //other fields

}

@Data
class ExperienceDTO {

private String joiningDate;

//other fields
}

Run Code Online (Sandbox Code Playgroud)

将 UserMapper 接口编写为:-

@Mapper(componentModel = "spring")
public interface UserMapper {

 @Mappings({
            @Mapping(target = "firstName",source = "fullName",
                    qualifiedByName = "firstNameExtractor"),
            @Mapping(target = "lastName",source = "fullName",
                    qualifiedByName = "lastNameExtractor")
    })
    UserDTO userToUserDTO(User user);

  @Mappings({
      @Mapping(target = "joiningDate", source = "joiningDate",
              dateFormat = "yyyy-MM-dd HH:mm:ss")
    })
    List<ExperienceDTO> experienceToExperienceDTO(List<Experience> experience);

@Named("firstNameExtractor")
    public static String getFirstName(String name){
        String[] nameParts = name.split(" ");
        return nameParts[0];
    }
//similarly have a lastNameExtractor
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:-

  1. 源参数中不存在名为“fullName”的属性。您指的是“null”吗?
  2. 结果类型 com.personal.portfolio.dto.UserDTO 中存在未知属性“firstName”。您指的是“null”吗?
  3. 源参数中不存在名为“joiningDate”的属性。你的意思是“空”吗?
  4. 结果类型 java.util.List 中的未知属性“joiningDate”。您指的是“空”吗?

我知道我的设计可能是错误的,但我故意这样做是为了了解 MapStruct 的工作原理。请任何人都可以帮助我理解我犯了什么错误?

zla*_*val 7

第一个错误是因为 MapStruct 没有看到 Lombok 带注释的方法。将注释处理器添加到构建中:

                   <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${org.projectlombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
Run Code Online (Sandbox Code Playgroud)

第二个是将 @Mapping 添加到对象列表中,而不是对象本身。创建一个方法,将单个体验映射到 ExperienceDTO,在其中添加注释并将其从 experienceToExperienceDTO 方法中删除。