无法使用 Mapstruct 生成没有输入参数的映射方法

Posted

技术标签:

【中文标题】无法使用 Mapstruct 生成没有输入参数的映射方法【英文标题】:Can't generate mapping method with no input arguments with Mapstruct 【发布时间】:2019-08-31 08:14:55 【问题描述】:

我正在使用 Mapstruct 映射器开始我的第一步。我想将 JPA 数据实体类映射到 DTO 类。这是我的源类:

@Entity
@Data
@Table(name = "projects")
public class Project 
    @Id
    private Long Id;
    private String projectName;
    private String description;

    @OneToMany(mappedBy = "project")
    List<Sprint> sprints;

    @OneToMany(mappedBy = "project")
    List<Epic> epics;

    @OneToMany(mappedBy = "project")
    List<Story> stories;

    public Project(Long id, String projectName, String description) 
        Id = id;
        this.projectName = projectName;
        this.description = description;
    

这是我的目标类:

@Data
@AllArgsConstructor
public class ProjectDTO 
    private Long Id;
    private String projectName;
    private String description;

@Data 注释来自 Lombok。 我想制作一个映射器将项目映射到 ProjectDTO,诸如 sprint、史诗、故事等属性不应包含在 ProjectDTO 中。这是我的映射器界面:

@Mapper
public interface ProjectMapper extends Mapper 

    ProjectMapper INSTANCE = Mappers.getMapper(ProjectMapper.class)

    ProjectDTO projectToProjectDTO(Project project);

当我尝试构建它时,这是我收到的错误消息:

[错误] 无法生成没有输入参数的映射方法。

我猜这与 ProjectDTO 中缺少的属性有关,但不知道如何解决。使用@Mapping,我不能这样做:

@Mapping(source=“sprints”, target= null)

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

也添加“@NoArgConstructor”。 MapStruct 不能(还)处理通过构造函数构造对象。如果您的对象是真正不可变的,另一种选择是使用“@Builder”

【讨论】:

感谢您的评论,在我的情况下它不起作用。我如何通过在我的 ProjectServiceImpl 构造函数中获取映射器实例来找到解决方案。我也会把它放在这里作为答案【参考方案2】:

您不应扩展注解 Mapper。只在接口的类型声明级别使用它就足够了

【讨论】:

以上是关于无法使用 Mapstruct 生成没有输入参数的映射方法的主要内容,如果未能解决你的问题,请参考以下文章

mapstruct工具包的使用

如何让 Eclipse 使用 Gradle 生成 MapStruct 映射器

如何更改MapStruct生成的* .java文件的位置?

使用 mapstruct 进行映射:错误:(22,48)java:参数“quote”的类型没有名为“quote_type”的属性

Mapstruct 映射:如果所有源参数属性为空,则返回空对象

Mapstruct 映射:如果所有源参数属性为空,则返回空对象