Множественные проблемы с отображением MapStruct

Я новичок в использовании 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". Ты хотел сказать "нулевой"?
  2. Неизвестное свойство firstName в типе результата com.personal.portfolio.dto.UserDTO. Ты хотел сказать "нулевой"?
  3. В исходных параметрах не существует свойства с именем «joiningDate». Ты хотел сказать пустой"?
  4. Неизвестное свойство «joiningDate» в типе результата java.util.List. Ты хотел сказать "пустой"?

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


person Subham Saha    schedule 25.05.2020    source источник
comment
Вы также сгенерировали Getter/Setters?   -  person Nitesh Sharma    schedule 25.05.2020
comment
Да, используя Ломбок. Я добавил аннотацию @Data.   -  person Subham Saha    schedule 25.05.2020
comment
Хорошо, я могу избавиться от ошибок, связанных с firstName, добавив артефакт ломбока в ‹annotationProcessorPaths› ломбока. Но проблема, связанная с датой, все еще сохраняется.   -  person Subham Saha    schedule 25.05.2020
comment
Но, как я вижу, вы передаете формат даты в тип без даты, на самом деле у вас есть строковый тип, а не дата, можете ли вы попытаться изменить его на дату или что-то в этом роде?   -  person Nitesh Sharma    schedule 25.05.2020
comment
Я хочу преобразовать дату (в модели) в строку (в DTO). Я следовал ссылке из этого руководства: - baeldung.com/mapstruct#Type   -  person Subham Saha    schedule 26.05.2020


Ответы (2)


Первая ошибка связана с тем, что 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 в список объектов, а не в сам объект. Создайте метод, который сопоставляет один опыт с ExperienceDTO, добавьте туда аннотацию и удалите ее из метода experienceToExperienceDTO.

person zlaval    schedule 25.05.2020

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

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

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

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

person Subham Saha    schedule 26.05.2020