Я пытаюсь создать преобразователь класса «PersonDto» в «PersonEntity» с помощью MapStruct
Обратите внимание на следующие классы Entity, Dto и Mapper.
PersonEntity.java
package com.example.car;
import java.util.ArrayList;
import java.util.List;
public class PersonEntity {
private String name;
private List<CarEntity> cars;
public PersonEntity() {
cars = new ArrayList<>();
}
public boolean addCar(CarEntity carEntitiy) {
return cars.add(carEntitiy);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<CarEntity> getCars() {
return cars;
}
public void setCars(List<CarEntity> carEntities) {
this.cars = carEntities;
}
}
CarEntity.java
package com.example.car;
public class CarEntity {
private String model;
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
PersonDto.java
package com.example.car;
import java.util.ArrayList;
import java.util.List;
public class PersonDto {
private String name;
private List<CarDto> cars;
public PersonDto() {
cars = new ArrayList<>();
}
public boolean addCar(CarDto carDto) {
return cars.add(carDto);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<CarDto> getCars() {
return cars;
}
public void setCars(List<CarDto> carDtos) {
this.cars = carDtos;
}
}
CarDto.java
package com.example.car;
public class CarDto {
private String model;
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
PersonMapper
package com.example.car;
import org.mapstruct.CollectionMappingStrategy;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
PersonEntity personDtoToPersonEntity(PersonDto personDto);
}
Когда я пытаюсь сгенерировать код, используя инструкции maven по ссылке это, я получаю следующую ошибку:
Can't map property "java.util.List cars" to "com.example.car.CarEntity cars". Consider to declare/implement a mapping method: "com.example.car.CarEntity map(java.util.List value)".
Если я удалю метод «сумматора» из классов Person, он будет работать нормально. Но я действительно хочу использовать методы сумматора (для целей отношений между родительскими и дочерними объектами JPA).
Я не уверен, почему MapStruct не интерпретирует свойство cars в PersonEntity как List. Это свойство интерпретируется как простой CarEntity, а не как List of CarEntity.




Вам также следует рассмотреть возможность сопоставления свойства Has-A вашего класса.
Просто включите CarEntity carDtoToCarEntity (CarDto carDto)
Вот фрагмент кода:
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
CarEntity carDtoToCarEntity(CarDto carDto);
PersonEntity personDtoToPersonEntity(PersonDto personDto);
}
Дайте мне знать, если вы все еще застряли.
Это работало с 1.2.0? Да, не должно быть необходимости создавать метод carDtoToCarEntity. Может это ошибка. Не могли бы вы открыть заявку со своей проблемой, чтобы мы могли ее рассмотреть? Примечание: я один из членов команды MapStruct
@Filip Я думаю, что проблема соответствия уже создана. Я добавил туда свой комментарий. Вот ссылка на сайт.
В вашем @Mapper
@Mapper(componentModel = "spring",uses = CarMapper.class)
аннотация, которую вы должны использовать mapper для любого типа вложенного типа, который у вас есть в вашей сущности
Спасибо. Работает нормально. Но я не понимаю одного: начиная с версии 1.2.0 MapStruct поддерживает «Автоматическое создание вложенных методов сопоставления», как описано в ссылке это. Сейчас я использую 1.3.0.Beta1. Итак, зачем мне определять отображение для вложенного свойства «cars»?