Spring

MapStruct 매핑과 관련된 여러 문제

기록만이살길 2022. 11. 13. 20:29
반응형

MapStruct 매핑과 관련된 여러 문제

1. 질문(문제점):

저는 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. 결과 유형 com.personal.portfolio.dto.UserDTO에 알 수 없는 속성 "firstName"이 있습니다. "null"을 의미 했습니까?
  3. 소스 매개변수에 "joiningDate"라는 속성이 없습니다. 텅텅 비었단 말입니까?"
  4. 결과 유형 java.util.List에 알 수 없는 속성 "joiningDate"가 있습니다. "비어있다"라고 하셨나요?

내 디자인이 틀릴 수도 있다는 것을 알고 있지만 MapStruct가 작동하는 방식을 이해하기 위해 의도적으로 이렇게 합니다. 친절하게도 내가 어떤 실수를 하고 있는지 이해하는 데 도움을 줄 수 있는 사람이 있습니까?

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>

두 번째는 개체 자체가 아니라 개체 List에 @Mapping을 추가하는 것입니다. 단일 경험을 ExperienceDTO에 매핑하는 메서드를 만들고 거기에 어노테이션을 추가한 다음 experienceToExperienceDTO 메서드에서 제거합니다.

반응형