Mapstruct:用qualifiedByName映射List

问题描述 投票:0回答:1

我正在尝试映射一个包含另一个 dto 列表的 dto,并从另一个映射器中调用它的方法。但即使我使用的是qualifiedByName参数,我也会收到错误“发现不明确的映射方法”,并且使用哪种方法应该是显而易见的。

Dto 角色DTO:

public class RoleDTO extends AbstractDTO {
...
    private List<DepartmentDTO> departments = new ArrayList<>();    //it's a list!
}

抽象映射器:

public interface GenericMapper<E extends AbstractEntity, D extends AbstractDTO> {
    @IterableMapping(qualifiedByName = "toEntity")
    @Named("toEntities")
    @NotNull
    List<E> toEntities(@NonNull List<D> dtos);

    @Named("toEntity")
    @NotNull
    default E toEntity(@NonNull D dto) {
        return toEntityCycleAvoiding(dto, new CycleAvoidingMappingContext());
    }
}

角色映射器:

@Mapper(uses = {DepartmentMapper.class})
public interface RoleMapper extends GenericMapper<Role, RoleDTO> {

    @Mapping(target = "departments", qualifiedByName = "toEntitiesLightweight") //I'm using the right method!
    @Named("toEntityLightweight")
    Role toEntityLightweight(@NonNull RoleDTO role);
}

部门映射器:

@Mapper(uses = {...})
public interface DepartmentMapper extends GenericMapper<Department, DepartmentDTO> {
    @Mapping(target = "parent", ignore = true)
    @Mapping(target = "schedule", ignore = true)
    @Mapping(target = "language", ignore = true)
    @Named("toEntityLightweight")
    Department toEntityLightweight(@NonNull DepartmentDTO department);

    @IterableMapping(qualifiedByName = "toEntityLightweight")
    @Named("toEntitiesLightweight")
    List<Department> toEntitiesLightweight(@NonNull List<DepartmentDTO> departments);
}

但是在构建时出现错误:

[错误] my-project/mapper/RoleMapper.java:[39,9] 错误:发现将集合元素映射到 my-project.domain.Department 的映射方法不明确:my-project.domain.Department my-project.mapper .DepartmentMapper.toEntity(my-project.dto.DepartmentDTO dto), my-project.domain.部门 my-project.mapper.DepartmentMapper.toEntityLightweight(@lombok.NonNull my-project.dto.DepartmentDTO 部门)。

映射器应该对列表使用一种方法(toEntitiesLightweight),但抱怨它无法决定一个元素的方法,尽管这根本不是它所关心的。

好吧,为了实验方便,我将在RoleMapper中的qualifiedByName中写入“toEntityLightweight”。

[错误] my-project/mapper/RoleMapper.java:[37,4] 错误:发现将属性“java.util.List Departments”映射到 @org.jetbrains.annotations.NotNull java.util 时存在不明确的映射方法。列表:@org.jetbrains.annotations.NotNull java.util.List my-project.mapper.DepartmentMapper.toEntities(@lombok.NonNull java.util.List dtos),java.util.List我的项目。 mapper.DepartmentMapper.toEntitiesLightweight(@lombok.NonNull java.util.List 部门).

[错误] my-project/mapper/RoleMapper.java:[37,4] 错误:发现将属性“java.util.List Departments”映射到 java.util.List 时存在不明确的映射方法:@org.jetbrains。注释.NotNull java.util.List my-project.mapper.DepartmentMapper.toEntities(@lombok.NonNull java.util.List dtos), java.util.List my-project.mapper.DepartmentMapper.toEntitiesLightweight(@lombok .NonNull java.util.List 部门).

现在他抱怨他无法决定列表的方法。逻辑性强。出于某种原因,他抱怨了两次。

如何解决?

java mapstruct
1个回答
0
投票

我发现了我的错误。 Dto 使用了

List<DepartmentDTO>
,但 dao 使用了
Set<Department>
,而不是 List。因此,
toEntitiesLightweight
方法必须返回
Set<Department>

© www.soinside.com 2019 - 2024. All rights reserved.