ModelMapper использует метод toString для преобразования свойства?

Я использую ModelMapper для сопоставления объектов с DTO в моем весеннем загрузочном приложении.

Теперь у меня есть что-то странное, у меня есть эта сущность:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MileStoneEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    @ManyToOne(targetEntity = ProjectEntity.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "projectEntity_id")
    private ProjectEntity project;
    @ManyToMany(targetEntity = CompanyUserEntity.class)
    private Set<CompanyUserEntity> projectManagers;
    @OneToMany(targetEntity = TaskEntity.class, mappedBy = "mileStone")
    private Set<TaskEntity> tasks;
    private boolean archived;

        public List<Long> projectManagersIds() {
        return projectManagers.stream().map(CompanyUserEntity::getId).collect(Collectors.toList());
    }

    public List<Long> taskIds() {
        return tasks.stream().map(TaskEntity::getId).collect(Collectors.toList());
    }
}

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TaskEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    @ManyToOne(targetEntity = ProjectEntity.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "projectEntity_id")
    @ManyToOne(targetEntity = CompanyUserEntity.class, fetch = FetchType.LAZY)
    private CompanyUserEntity executor;
    @ManyToOne(targetEntity = MileStoneEntity.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "mileStoneEntity_id")
    private MileStoneEntity mileStone;
    private boolean archived;
    private boolean replaceStartAndEndDateWithMileStone;
}

public static PropertyMap<MileStoneEntity, MileStoneDto> mileStoneEntityToMap = new PropertyMap<MileStoneEntity, MileStoneDto>() {
    protected void configure() {
        map().setProjectId(source.getProject().getId());
        map().setProjectManagers(source.projectManagersIds());
        map().setTasks(source.taskIds());
    }
};

ДТО

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MileStoneDto {
    private Long id;
    private String name;
    private Long projectId;
    private List<Long> projectManagers;
    private LocalDate startDate;
    private LocalDate endDate;
    private String description;
    private List<Long> tasks;
    private boolean archived;
}

Теперь это не работает, я получаю эту ошибку:

"Ошибки сопоставления ModelMapper:\n\n1) Преобразователю org.modelmapper.internal.converter.NumberConverter@ad01ae2 не удалось преобразовать entity.TaskEntity в java.lang.Long

Но когда я добавляю такой метод toString в TaskEntity:

@Override
public String toString() {
    return ""+id+"";
}

тогда все работает. Так почему же ModelMapper использует toString для преобразования идентификатора в Long?

РЕДАКТИРОВАТЬ

@Bean
ModelMapper modelMapper() {
    ModelMapper modelMapper = new ModelMapper();

    modelMapper.addMappings(ProjectMappings.mileStoneEntityToMap);


    return modelMapper;
}

person user1007522    schedule 20.06.2019    source источник


Ответы (1)


У вас нет одинаковых типов в вашей сущности и вашем dto:

Объект

private Set<TaskEntity> tasks;

DTO

private List<Long> tasks;

ModelMapper не знает, как преобразовать TaskEntity в Long.

Вы должны написать конвертер для этой цели:

http://modelmapper.org/user-manual/converters/

person Simon Martinelli    schedule 20.06.2019
comment
Но я определил карту свойств и сделал это для многих других сущностей, и это работает. Вы видите, что я вызываю метод для получения лонгов? - person user1007522; 20.06.2019
comment
Это вроде не называется. Где вы это настраиваете? - person Simon Martinelli; 20.06.2019
comment
Там, где я создаю новый ModelMapper(), я помещаю в него этот propertyMap. - person user1007522; 20.06.2019
comment
Я создал конвертер, и теперь он работает. Странно, что это работает на всех других объектах, кроме этого. Спасибо за вашу помощь! - person user1007522; 20.06.2019