Множественные проблемы с отображением MapStruct - PullRequest
2 голосов
/ 25 мая 2020

Я новичок в использовании MapStruct и поэтому сталкиваюсь с некоторыми проблемами с ним.

У меня есть следующие классы моделей: -

@Data
class User {

@Field
private String fullName;

@Field("experience")
private List<Experience> workExperience;

//other fields

}

@Data
class Experience {

private Date joiningDate;

//other fields
}

Теперь у меня есть следующие DTO

@Data
class UserDTO {

 private String firstName;

 private String lastName;

 private List<ExperienceDTO> workExperience;

 //other fields

}

@Data
class ExperienceDTO {

private String joiningDate;

//other fields
}

Записали интерфейс UserMapper как: -

@Mapper(componentModel = "spring")
public interface UserMapper {

 @Mappings({
            @Mapping(target = "firstName",source = "fullName",
                    qualifiedByName = "firstNameExtractor"),
            @Mapping(target = "lastName",source = "fullName",
                    qualifiedByName = "lastNameExtractor")
    })
    UserDTO userToUserDTO(User user);

  @Mappings({
      @Mapping(target = "joiningDate", source = "joiningDate",
              dateFormat = "yyyy-MM-dd HH:mm:ss")
    })
    List<ExperienceDTO> experienceToExperienceDTO(List<Experience> experience);

@Named("firstNameExtractor")
    public static String getFirstName(String name){
        String[] nameParts = name.split(" ");
        return nameParts[0];
    }
//similarly have a lastNameExtractor

Но я получаю следующие ошибки: -

  1. В источнике нет свойства с именем «fullName» параметр (ы). Возможно, вы имели в виду "null"?
  2. Неизвестное свойство "firstName" в типе результата com.personal.portfolio.dto.UserDTO. Вы имели в виду «null»?
  3. В параметрах источника нет свойства с именем «joiningDate». Вы имели в виду пустой "?
  4. Неизвестное свойство" joiningDate "в типе результата java .util.List. Вы имели в виду" пустой "?

Я знаю, что мой дизайн может быть неправильно, но я намеренно делаю это таким образом, чтобы понять, как работает MapStruct. Любезный кто-нибудь может помочь мне понять, какую ошибку я делаю?

Ответы [ 2 ]

3 голосов
/ 26 мая 2020

Первая ошибка связана с тем, что MapStruct не видит аннотированные методы Lombok. Добавьте в сборку обработчик аннотаций:

                   <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${org.projectlombok.version}</version>
                        </path>
                    </annotationProcessorPaths>

Во-вторых, вы добавляете @Mapping в список объектов, а не сам объект. Создайте метод, который сопоставляет один Experience с ExperienceDTO, добавьте туда аннотацию и удалите ее из метода experienceToExperienceDTO.

0 голосов
/ 26 мая 2020

Итак, наконец, я смог решить ошибки, и вот решение обеих проблем: -

  1. Как упоминалось @Zlaval, мне нужно было добавить процессор аннотаций в сборку MapStruct, чтобы избавиться от ошибки, связанной с FirstName.

  2. И для отображения списка в список нам не нужен метод List<DTOObject> entityListToDTOList(List<EntityObject> entity)

только , будет достаточно одного сопоставленного метода Entity to DTO с аннотацией @Mappings (если требуется).

...