Преобразование Dto в Entity с использованием MapStruct дает ошибку

Я пытаюсь создать преобразователь класса «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.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
3 173
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам также следует рассмотреть возможность сопоставления свойства 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 MapStruct поддерживает «Автоматическое создание вложенных методов сопоставления», как описано в ссылке это. Сейчас я использую 1.3.0.Beta1. Итак, зачем мне определять отображение для вложенного свойства «cars»?

FarhanNayyer 18.08.2018 20:51

Это работало с 1.2.0? Да, не должно быть необходимости создавать метод carDtoToCarEntity. Может это ошибка. Не могли бы вы открыть заявку со своей проблемой, чтобы мы могли ее рассмотреть? Примечание: я один из членов команды MapStruct

Filip 18.08.2018 21:19

@Filip Я думаю, что проблема соответствия уже создана. Я добавил туда свой комментарий. Вот ссылка на сайт.

FarhanNayyer 03.09.2018 06:00

В вашем @Mapper

@Mapper(componentModel = "spring",uses = CarMapper.class) 

аннотация, которую вы должны использовать mapper для любого типа вложенного типа, который у вас есть в вашей сущности

Другие вопросы по теме