programing

MapStruct - 구현을 찾을 수 없습니다.

closeapi 2023. 7. 25. 20:57
반응형

MapStruct - 구현을 찾을 수 없습니다.

최신 Springboot 및 MapStruct 버전을 사용하고 Maven과 함께 빌드하여 공식 MapStruct 사이트에 주어진 "Start Here" 예제를 구현하려고 합니다.

내 코드는 더 단순합니다.

pom.xml

<org.mapstruct.version>1.3.1.Final</org.mapstruct.version>

(...)

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>${org.mapstruct.version}</version>
</dependency>

(...)

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <annotationProcessorPaths>
                <path>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct-processor</artifactId>
                    <version>${org.mapstruct.version}</version>
                </path>
            </annotationProcessorPaths>
        </configuration>
    </plugin>

카.자바

public class Car {

    private String model;

    // Constructors, setters and getters...

}

카디토자바

public class CarDto {

    private String theModel;

    // Constructors, setters and getters...

}

CarMapper.java 인터페이스

@Mapper
public interface CarMapper {

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

    @Mapping(source = "model", target = "theModel")
    CarDto carToCarDto(Car car);
}

주 응용 프로그램

@SpringBootApplication
public class MappertestApplication {

    public static void main(String[] args) {
        SpringApplication.run(MappertestApplication.class, args);

        Car c = new Car("Volkswagen");

        CarDto cdto = CarMapper.INSTANCE.carToCarDto(c);

    }

}

모든 코드는 다음 공개 보고서에 있습니다. https://github.com/pgbonino/mappertest

실행 중에 다음 오류가 발생합니다.

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.gallelloit.mappertest.MappertestApplication.main(MappertestApplication.java:14)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Cannot find implementation for com.gallelloit.mappertest.CarMapper
    at org.mapstruct.factory.Mappers.getMapper(Mappers.java:61)
    at com.gallelloit.mappertest.CarMapper.<clinit>(CarMapper.java:10)
    ... 1 more
Caused by: java.lang.ClassNotFoundException: Cannot find implementation for com.gallelloit.mappertest.CarMapper
    at org.mapstruct.factory.Mappers.getMapper(Mappers.java:75)
    at org.mapstruct.factory.Mappers.getMapper(Mappers.java:58)
    ... 2 more

저는 이 문제를 공식 MapStruct 프로젝트에서 발견했는데, 이 프로젝트는 동일한 문제를 설명하는 것 같습니다.그러나 이 경우 일부 사용자 지정 구성(구현의 사용자 지정 이름)이 수행되고 있었습니다.저의 경우에는 모든 것이 기본값으로 유지됩니다.

감 잡히는 게 없어요?

비록 제 시나리오가 당신의 시나리오와 같지는 않지만, 같은 오류가 발생했습니다. 그래서 저는 저와 같은 실수를 한 다른 사람들을 돕고 해결책을 찾기 위해 이 답변을 게시합니다.

메이븐 종속성을 가져오는 중이었습니다.

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>${org.mapstruct.version}</version>
</dependency>

그러나 메이븐 컴파일러 플러그인에 주석 프로세서 경로를 추가하는 것을 잊었습니다.

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

나는 지도 구조 프로세서 종속성을 추가했고 그것은 나에게 효과가 있었습니다.

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.3.1.Final</version>
</dependency>

프로젝트에서 지정된 명령을 실행하면 문제가 해결되었습니다.

mvn clean install

그리고 나서 구현 파일이 생성되는 것을 보았습니다.구현을 생성하려면 maven 명령 실행이 필요한 것 같습니다.

IDE가 주석 프로세서를 호출하도록 적절하게 구성되었는지 확인해야 합니다.IDE 설정을 확인합니다.

당신이 제공한 프로젝트를 보면 코드는 컴파일조차 안 됩니다.MapStruct 프로세서가 다음과 같은 이유로 컴파일 오류를 발생시킵니다.

  • 에 기본 생성자 없음CarDto
  • 소유물model존재하지 않음Car(만 있습니다.marca)
  • 소유물theModel존재하지 않음CarDto(만 있습니다.laMarca)

는 매퍼 인터페이스에 @Mapper를 추가하는 것을 잊었기 때문에 똑같은 오류를 재현하고 있었습니다.

@Mapper // <-- missing
public interface MyMapper {

사소한 실수지만 놓치기 쉽습니다.

지도 구조의 롬복을 사용할 때도 비슷한 문제에 직면했는데, 알려진 문제입니다.제게 효과가 있었던 것은 주석 처리기 경로에 롬복 종속성을 추가한 것입니다.

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
    <source>${java.version}</source>
    <target>${java.version}</target>
    <annotationProcessorPaths>
        <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${org.projectlombok.version}</version>
        </path>
        <!-- This is needed when using Lombok 1.18.16 and above -->
        <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-mapstruct-binding</artifactId>
            <version>0.2.0</version>
        </path>
        <!-- Mapstruct should follow the lombok path(s) -->
        <path>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version>
        </path>
    </annotationProcessorPaths>
</configuration>

자세한 내용은 이 답변을 참조하십시오.

사용하는 것이 적절합니다.@Mapper(componentModel = "spring")

Mapper 클래스를 사용하면 주입을 사용하는 데 만족할 수 있습니다. 다음과 같이 하십시오.

@Autowired
private CarMapper carMapper;

모든 것이 괜찮은지 아닌지 확인하기 위해, 당신은 컴파일 후 당신의 매퍼 구현을 확인할 수 있습니다. 합니다.@component ㅠㅠ. 이렇게.

@Component
public class CarMapperImpl implements CarMapper {

플러그인 버전과 앱(소스 버전과 타겟 버전 모두)을 확인하고 동일하게 설정했습니다. 작동했습니다.

인터페이스에 할 수 . 예: 클래스에 해야 함). CarMapper 인터에한 INSTATION 변수다 ▁the▁so다:없니▁try▁variable수▁to▁car습▁should▁(in▁instance존▁that▁that▁variable▁objects▁move▁into▁be,,ement▁cannot변수▁car▁have▁instance▁the▁like▁be할재는▁on인▁instance▁where▁example▁there터▁to)▁youma▁interfacema▁created▁the▁class▁inst이스applic▁youpperting페 다음과 같이 인스턴스 변수를 객체를 변환하는 클래스로 이동합니다(예를 들어 인스턴스를 MappertestApplication 클래스에 배치해야 함).private static final CarMapper carMapper = Mappers.getMapper(CarMapper.class);나에게 이것은 잘 작동했습니다.

IDE에서 주석 처리를 활성화합니다.

이 문제를 해결하려면 이클립스 IDE에서 MapStruct Eclipse 플러그인을 구성해 보십시오.

언급URL : https://stackoverflow.com/questions/61710510/mapstruct-cannot-find-implementation

반응형