我正在尝试映射一个包含另一个 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 部门).
现在他抱怨他无法决定列表的方法。逻辑性强。出于某种原因,他抱怨了两次。
如何解决?
我发现了我的错误。 Dto 使用了
List<DepartmentDTO>
,但 dao 使用了 Set<Department>
,而不是 List。因此,toEntitiesLightweight
方法必须返回Set<Department>
。