【问题标题】:Multiple problems regarding MapStruct mapping关于 MapStruct 映射的多个问题
【发布时间】:2020-09-12 12:52:53
【问题描述】:

我是使用 MapStruct 的新手,因此遇到了一些问题。

我有以下模型类:-

@Data
class User {

@Field
private String fullName;

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

//other fields

}

@Data
class Experience {

private Date joiningDate;

//other fields
}

现在,我有以下 DTO

@Data
class UserDTO {

 private String firstName;

 private String lastName;

 private List<ExperienceDTO> workExperience;

 //other fields

}

@Data
class ExperienceDTO {

private String joiningDate;

//other fields
}

已将 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

但我收到以下错误:-

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

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

【问题讨论】:

  • 你是否也生成了Getter/Setter?
  • 是的,使用 Lombok。我已经添加了@Data 注释。
  • 好的,我可以通过将 lombok 工件添加到 lombok 的 来消除与 firstName 相关的错误。但是与日期相关的问题仍然存在。
  • 但正如我所见,您实际上将日期格式传递给非日期类型,您的字符串类型不是日期,您可以尝试将其更改为日期或其他内容吗?
  • 我想将我的日期(在模型中)转换为字符串(在 DTO 中)。我遵循本教程的参考资料:- baeldung.com/mapstruct#Type

标签: java spring mapstruct object-object-mapping


【解决方案1】:

第一个错误是因为 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>

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

【讨论】:

    【解决方案2】:

    所以,我终于可以解决错误,这里是解决这两个问题的方法:-

    1. 正如@Zlaval 所说,我需要将注释处理器添加到 MapStruct 的构建中,以消除与 FirstName 相关的错误。

    2. 为了将 List 映射到 List,我们不需要方法 List&lt;DTOObject&gt; entityListToDTOList(List&lt;EntityObject&gt; entity)

    仅,带有@Mappings 注释(如果需要)的单个实体到 DTO 映射方法就足够了。

    【讨论】:

      【解决方案3】:

      将以下标签添加到“maven-compiler-plugin”插件

      <configuration>
          <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>1.18.20</version>
              </path>
              <path>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok-mapstruct-binding</artifactId>
                  <version>0.1.0</version>
              </path>
          </annotationProcessorPaths>
      </configuration> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-05
        • 1970-01-01
        • 2020-04-07
        • 2020-09-04
        • 1970-01-01
        • 2016-04-19
        • 2022-08-15
        相关资源
        最近更新 更多