programing

@MAPSTRUCT.소스 매개 변수에 "패키지"라는 속성이 없습니다.

newsource 2023. 6. 29. 20:10

@MAPSTRUCT.소스 매개 변수에 "패키지"라는 속성이 없습니다.

나는 글을 쓰고 있습니다.MVC REST 신청.Spring Boot그리고.Hibernate는 하로했다니습기다를 로 결정했습니다.DTO:매핑을 사용한 MAPSTRUCT가이드에 따라 다 한 것 같은데 오류가 발생합니다.뭐가 문제죠, 이해할 수가 없어요.포럼과 구글에는 정보가 거의 없습니다.

에 저는 가 추신: 처에저문에 했습니다.Lombok그래서 제거했습니다.Lombok 수동으로 할당된 동으로됨당getters / setters그러면 문제가 해결되지 않았습니다.저는 둘 다 가져갔어요.Drink학급과 학교에서.DrinkDTO는 처습니를 했습니다.getters / setters여전히 도움이 되지 않았습니다.

음료:

@Entity
@Table(name = "drink", schema = "public")
public class Drink {

    public Drink() { // Constructor for Hibernate

    }


    // Fields
    //
    private @Id
    @GeneratedValue
    Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "price")
    private float price;

    @Column(name = "about")
    private String about;

    @Column(name = "is_deleted")
    private boolean isDeleted;

    // Relationships
    //
    @ManyToOne
    @JoinColumn(name = "packaging_id")
    private Packaging packaging;

    @ManyToOne
    @JoinColumn(name = "manufacturer_id")
    private Manufacturer manufacturer;

    @ManyToOne
    @JoinColumn(name = "country_id")
    private Countries countries;
}

음료 DTO:

public class DrinkDTO {

    // Fields
    //
    private String drinkName;

    private float drinkPrice;

    private String drinkAbout;

    private Packaging drinkPackaging;

    private Manufacturer drinkManufacturer;

    private Countries drinkCountries;


    // Getters and Setters
    //
    public String getDrinkName() {
        return drinkName;
    }

    public void setDrinkName(String drinkName) {
        this.drinkName = drinkName;
    }

    public float getDrinkPrice() {
        return drinkPrice;
    }

    public void setDrinkPrice(float drinkPrice) {
        this.drinkPrice = drinkPrice;
    }

    public String getDrinkAbout() {
        return drinkAbout;
    }

    public void setDrinkAbout(String drinkAbout) {
        this.drinkAbout = drinkAbout;
    }

    public Packaging getDrinkPackaging() {
        return drinkPackaging;
    }

    public void setDrinkPackaging(Packaging drinkPackaging) {
        this.drinkPackaging = drinkPackaging;
    }

    public Manufacturer getDrinkManufacturer() {
        return drinkManufacturer;
    }

    public void setDrinkManufacturer(Manufacturer drinkManufacturer) {
        this.drinkManufacturer = drinkManufacturer;
    }

    public Countries getDrinkCountries() {
        return drinkCountries;
    }

    public void setDrinkCountries(Countries drinkCountries) {
        this.drinkCountries = drinkCountries;
    }

    // toSTRING
    @Override
    public String toString() {
        return "DrinkDTO{" +
                "drinkName='" + drinkName + '\'' +
                ", drinkPrice=" + drinkPrice +
                ", drinkAbout='" + drinkAbout + '\'' +
                ", drinkPackaging=" + drinkPackaging +
                ", drinkManufacturer=" + drinkManufacturer +
                ", drinkCountries=" + drinkCountries +
                '}';
    }

고객 컨트롤러:

@GetMapping("/drinks")
    List<DrinkDTO> getAllDrinks(){
        return DrinkMapper.INSTANCE.drinksToDrinksDTO(customerService.getAllDrinks());
    }

빌드.그라들

// Mapstruct
    implementation 'org.mapstruct:mapstruct:1.3.1.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.3.1.Final'

음료 지도:

@Mapper
public interface DrinkMapper {

    DrinkMapper INSTANCE = Mappers.getMapper(DrinkMapper.class);

    @Mapping(source = "name", target = "drinkName")
    @Mapping(source = "price", target = "drinkPrice")
    @Mapping(source = "about", target = "drinkAbout")
    @Mapping(source = "packaging", target = "drinkPackaging")
    @Mapping(source = "manufacturer", target = "drinkManufacturer")
    @Mapping(source = "countries", target = "drinkCountries")
    DrinkDTO drinkToDrinkDTO(Drink drink);

    @Mapping(source = "drinkName", target = "name")
    @Mapping(source = "drinkPrice", target = "price")
    @Mapping(source = "drinkAbout", target = "about")
    @Mapping(source = "drinkPackaging", target = "packaging")
    @Mapping(source = "manufacturer", target = "drinkManufacturer")
    @Mapping(source = "countries", target = "drinkCountries")
    Drink drinkDTOtoDrink(DrinkDTO drinkDTO);

    @Mapping(source = "name", target = "drinkName")
    @Mapping(source = "price", target = "drinkPrice")
    @Mapping(source = "about", target = "drinkAbout")
    @Mapping(source = "packaging", target = "drinkPackaging")
    @Mapping(source = "manufacturer", target = "drinkManufacturer")
    @Mapping(source = "countries", target = "drinkCountries")
    List<DrinkDTO> drinksToDrinksDTO(List<Drink> drinks);
}

오류:

사용 시 동일한 문제가 발생하는 사용자의 경우mapstruct+lombok:

저도 같은 문제가 있었습니다.그 이유는 제가 계속 사용했기 때문입니다.Lombok플러그인도 있습니다.제거할 필요는 없지만 다음 단계에서 확인해야 합니다.pom.xml<annotationProcessorPaths>Lombok 태그는 Mapstruct보다 앞에 있습니다.

예(pom.xml 파일의 일부):

<build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                        <encoding>${project.build.sourceEncoding}</encoding>
                        <annotationProcessorPaths>
                            <path>
                                <groupId>org.projectlombok</groupId> <!-- IMPORTANT - LOMBOK BEFORE MAPSTRUCT -->
                                <artifactId>lombok</artifactId>
                                <version>${lombok.version}</version>
                            </path>
                            <path>
                                <groupId>org.mapstruct</groupId>
                                <artifactId>mapstruct-processor</artifactId>
                                <version>${org.mapstruct.version}</version>
                            </path>
                        </annotationProcessorPaths>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

오류는 속성을 매핑하려고 했다는 사실에서 발생합니다.List<>존재하지 않는 물건들입니다.Mapstruct는 목록 내 요소를 매핑하는 방법을 알고 있는 경우 목록 간의 매핑을 생성할 수 있을 정도로 똑똑합니다.

따서지정필없다습니가요할라를 지정할 필요가 없습니다@Mapping목록 대 목록 매핑의 주석.는 맵구는사니다용합다음을을 합니다.drinkToDrinkDTO매핑 방법을 자동으로 지정합니다.

@Mapping(...)
DrinkDTO drinkToDrinkDTO(Drink drink);

List<DrinkDTO> drinksToDrinksDTO(List<Drink> drinks);

@Jakub Swowikowski 답변에 추가하자면, 그라들 의존성에서도 동일한 일이 발생합니다.다음 주문으로 인해 오류가 발생했습니다.

dependencies {    
...
annotationProcessor("org.mapstruct:mapstruct-processor:${mapstructVersion}")

annotationProcessor("org.projectlombok:lombok:${lombokVersion}")
...
}

그래서 어쩔 수 없이 순서를 바꿨습니다.

dependencies {    
...
annotationProcessor("org.projectlombok:lombok:${lombokVersion}")
    
annotationProcessor("org.mapstruct:mapstruct-processor:${mapstructVersion}")
...
}

저의 경우, 오류는 주석 처리기의 선언 순서가 아니라 누락된 롬복 주석에서 비롯되었습니다.

에 대한 매핑이 있었습니다.CustomerCustomerDto 러나그나Customer게터와 세터가 누락되었습니다.

CustomerDto toCustomerDto(Customer customer);

와 함께

@Data
public class CustomerDto {
  ...
}

그리고.

public class Customer {
  ...
}

추가하기@Data에▁Customer수업은 나를 위해 그 문제를 해결해주었습니다.

PackakingMapper, CountriesMapper가 있는 경우 다음과 같이 @Mapper 주석에 uses 매개변수를 추가합니다.

@Mapper(uses = {PackagingMapper.class, CountriesMapper.class, ManufacturerMapper.class})
public interface DrinkMapper{
    ....
}

당신의 pom.xml 파일에 롬복 의존성을 첫 번째 의존성으로 넣으십시오.

그런 다음 메이븐 프로젝트를 다시 로드

mapstruct 플러그인을 추가할 필요가 없습니다. 저는 종속성을 사용했을 뿐입니다.

    <dependencies>
    **<dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>**
    <!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.5.5.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.5.5.Final</version>
    </dependency>
    </dependencies>

    <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

절 믿으세요. Lombok을 Spring Boot Maven 플러그인 구성에서 제외하더라도 프로젝트에서 계속 사용할 수 있습니다.플러그인의 제외 구성은 Maven에게 지정된 아티팩트를 플러그인의 클래스 경로에서 제외하도록 지시하기만 하면 됩니다.이 경우 Lombok 아티팩트는 Spring Boot Maven 플러그인의 클래스 경로에서 제외되지만 프로젝트의 클래스 경로에서는 제외되지 않습니다.

사용 시 동일한 문제가 발생하는 사용자의 경우mapstruct + lombok
지도 구조가 둘 다 작동하기 전에 롬복을 추가합니다.lombok&Mapstruct에 기초로 함annotation-processor그리고 맵 구조는 맵퍼 구현을 생성하기 위해 롬복에서 생성된 getter & setter에 의존합니다.순서를 변경할 때 lombok getter & setter가 먼저 생성되고 그 다음에 지도 구조에 의해 사용됩니다. 그래서 왜 순서를 변경하는지에 대한 이유는annotationProcessor작품!!

저도 이것에 부딪혔는데, 범인은 사용한 것입니다.

@액세서리(유연=참)

내 엔터티 수업에서.실험적인 롬복 기능을 사용하는 데 적합합니다! :)

단계:

  1. 생성Getters / Setters위해서Drink그리고.DrinkDTO수업(아마도 없을 것입니다)Lombok).

  2. 다음을 사용하여 프로젝트 구축Gradle작업:Build

  3. 프로젝트 시작!

언급URL : https://stackoverflow.com/questions/63034956/mapstruct-no-property-named-packaging-exists-in-source-parameters