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
'programing' 카테고리의 다른 글
페르시아/아랍 숫자를 영어 숫자로 변환 (0) | 2023.07.25 |
---|---|
페이지 요청 생성자가 더 이상 사용되지 않습니다. (0) | 2023.07.25 |
폼을 사용하지 않고 POST 변수 설정 (0) | 2023.07.25 |
C에서 *와 &의 차이점은 무엇입니까? (0) | 2023.07.25 |
런타임에 jQuery를 사용하여 CSS 규칙/클래스 만들기 (0) | 2023.07.25 |