I’m trying to map a dto that contains a list of another dto, and call a method from another mapper for it. But I get the error “Ambiguous mapping methods found” even though I’m using the qualifiedByName parameter, and it should be obvious which method to use.
Dto RoleDTO:
public class RoleDTO extends AbstractDTO {
...
private List<DepartmentDTO> departments = new ArrayList<>(); //it's a list!
}
Abstract Mapper:
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());
}
}
RoleMapper:
@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);
}
DepartmentMapper:
@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);
}
But when building I get an error:
[ERROR] my-project/mapper/RoleMapper.java:[39,9] error: Ambiguous mapping methods found for mapping collection element to my-project.domain.Department: my-project.domain.Department my-project.mapper.DepartmentMapper.toEntity(my-project.dto.DepartmentDTO dto), my-project.domain.Department my-project.mapper.DepartmentMapper.toEntityLightweight(@lombok.NonNull my-project.dto.DepartmentDTO department).
The mapper should use a method for the list (toEntitiesLightweight), but complains that it cannot decide on a method for one element, although this is not its concern at all.
Okay, for the sake of experiment, I’ll write “toEntityLightweight” in RoleMapper in qualifiedByName.
[ERROR] my-project/mapper/RoleMapper.java:[37,4] error: Ambiguous mapping methods found for mapping property “java.util.List<my-project.dto.DepartmentDTO> departments” to @org.jetbrains.annotations.NotNull java.util.List<my-project.domain.Department>: @org.jetbrains.annotations.NotNull java.util.List<my-project.domain.Department> my-project.mapper.DepartmentMapper.toEntities(@lombok.NonNull java.util.List<my-project.dto.DepartmentDTO> dtos), java.util.List<my-project.domain.Department> my-project.mapper.DepartmentMapper.toEntitiesLightweight(@lombok.NonNull java.util.List<my-project.dto.DepartmentDTO> departments).
[ERROR] my-project/mapper/RoleMapper.java:[37,4] error: Ambiguous mapping methods found for mapping property “java.util.List<my-project.dto.DepartmentDTO> departments” to java.util.List<my-project.domain.Department>: @org.jetbrains.annotations.NotNull java.util.List<my-project.domain.Department> my-project.mapper.DepartmentMapper.toEntities(@lombok.NonNull java.util.List<my-project.dto.DepartmentDTO> dtos), java.util.List<my-project.domain.Department> my-project.mapper.DepartmentMapper.toEntitiesLightweight(@lombok.NonNull java.util.List<my-project.dto.DepartmentDTO> departments).
Now he’s complaining that he can’t decide on a method for the list. Logical. And for some reason he complains twice.
How to fix it?